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;
}
댓글 남기기