c++ callstack 을 코드로 표시하기

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;
}

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다