debug log 에 callstack 을 넣을 수 있는 방법(MSVC)
#include <windows.h> #include <dbghelp.h> #include <iostream> #include "gtest/gtest.h" #define WIN32_LEAN_AND_MEAN #pragma comment(lib, "dbghelp.lib") std::string GetCallStackString() { // 호출 스택 정보를 저장할 stringstream std::stringstream ss; // 호출 스택 정보 수집 const int maxFrames = 64; void* stack[maxFrames]; USHORT frames = CaptureStackBackTrace(0, maxFrames, stack, NULL); // 심볼 해결을 위한 초기화 SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS); SymInitialize(GetCurrentProcess(), NULL, TRUE); // 각 호출 스택 프레임을 stringstream에 추가 for (USHORT i = 0; i < frames; ++i) { DWORD64 address = (DWORD64)(stack[i]); // 심볼 정보를 얻기 위해 주소를 문자열로 변환 char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)]; PSYMBOL_INFO symbol = (PSYMBOL_INFO)buffer; symbol->SizeOfStruct = sizeof(SYMBOL_INFO); symbol->MaxNameLen = MAX_SYM_NAME; if (SymFromAddr(GetCurrentProcess(), address, NULL, symbol)) { ss << i << ": " << symbol->Name << " - 0x" << std::hex << address << std::endl; } else { ss << i << ": Unable to get symbol information - 0x" << std::hex << address << std::endl; } } // 심볼 해결 해제 SymCleanup(GetCurrentProcess()); // stringstream을 string으로 변환하여 반환 return ss.str(); } int ExampleFunction(int a, int b) { std::string callStack = GetCallStackString(); std::cout << callStack; return a + b; }
댓글 남기기