[유니티/C#] C++ dll 의 로그 확인하는 방법
프로그래밍/유니티2018. 4. 16. 21:38
안녕하세요. 개발자 드리머즈입니다.
유니티에서 OpenCV C++ dll을 사용하여 앱을 개발하고 있습니다. 개발 도중 문제가 생겨 C++ dll에서 발생하는 로그를 확인하고 싶었습니다. 그런데 여기서 printf등을 통해 발생시킨 로그는 유니티에서 확인이 불가능한 것 같습니다.
제가 아직 유니티 초보라 더 나은 방법이 있을 수 있지만 일단 제가 확인한 방법은 아래 2가지 입니다.
C++ dll 로그 확인하는 방법1
유니티 C# 코드의 클래스 내부에 작성
1 2 3 4 5 6 7 8 9 10 11 12 13 | [UnmanagedFunctionPointer(CallingConvention.StdCall)] private delegate void DebugLog(string log); private static readonly DebugLog debugLog = DebugWrapper; private static readonly IntPtr functionPointer = Marshal.GetFunctionPointerForDelegate(debugLog); private static void DebugWrapper(string log) { Debug.Log(log); } [DllImport("YourDLLName")] private static extern void LinkDebug([MarshalAs(UnmanagedType.FunctionPtr)]IntPtr debugCal); | cs |
유니티 C# 코드의 클래스 내부에 작성
1 2 3 4 5 6 | public static void SetUpDebug() { DebugLog debug; debug = DebugWrapper; IntPtr ptr = Marshal.GetFunctionPointerForDelegate(debug); LinkDebug(ptr); } | cs |
유니티 C# 코드의 클래스 내부에 작성
1 2 3 4 5 | void Start() { ....(생략).... SetUpDebug(); } | cs |
DLL을 만드는 C++소스의 상단 전역변수 부분에 작성
1 2 3 4 5 6 7 8 9 10 | extern "C" { void (_stdcall*debugLog)(char*) = NULL; __declspec(dllexport) void LinkDebug( void(_stdcall*d)(char *)) { debugLog = d; d("Debug Link Successful!"); } } | cs |
DLL을 만드는 C++소스에서 로그 출력하고자 하는 위치에 코드 삽입
1 2 3 4 | if (debugLog != NULL) { debugLog("test"); } | cs |
장점 : 유니티의 콘솔에서 실시간으로 로그 확인이 가능하다.
단점 : char 배열만 출력 가능하기에 int형 변수처럼 다른 char 배열이 아닌 타입은 그 값을 확인하기 어렵다.
참고 : https://forum.unity.com/threads/how-to-use-debug-in-c-dll.107003/
C++ dll 로그 확인하는 방법2
DLL을 만드는 C++소스에 아래의 코드 삽입
1 2 | freopen("debug.txt", "a", stdout); printf("Debug a = %d", a); | cs |
장점 : 사용이 간단하고 printf의 포멧으로 디버깅 값 출력이 쉬움
단점 : 유니티 콘솔에 출력되는 게 아니라 유니티 프로젝트의 루트 경로에 생성된 파일 debug.txt를 확인해야 함
참고 : https://answers.unity.com/questions/127380/how-to-printdebug-from-a-c-plugin.html
댓글 영역