[유니티/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(dllexportvoid 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

작성자

Posted by 드리머즈

관련 글

댓글 영역