classStackTrace { private: staticconstint m_MaxFrameCount = 62; int m_FrameCount; void* m_Frames[m_MaxFrameCount]; public: StackTrace() { m_FrameCount = CaptureStackBackTrace(1, m_MaxFrameCount, m_Frames, NULL); } voidPrint() { HANDLE process = GetCurrentProcess(); SymSetOptions(SYMOPT_LOAD_LINES); // set symbol option to load the source code lines SymInitialize(process, NULL, TRUE); // init symbol char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)]; // define the PSYMBOL_INFO PSYMBOL_INFO symbol = (PSYMBOL_INFO)buffer; symbol->SizeOfStruct = sizeof(SYMBOL_INFO); symbol->MaxNameLen = MAX_SYM_NAME;
IMAGEHLP_LINE64 line; // define the IMAGEHLP_LINE64 line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
for (int i = 0; i < m_FrameCount; i++) { DWORD64 dw64Displacement; SymFromAddr(process, (DWORD64)(m_Frames[i]), &dw64Displacement, symbol); // get symbol info std::cout << symbol->Name; DWORD dwDisplacement; if (SymGetLineFromAddr64(process, (DWORD64)(m_Frames[i]), &dwDisplacement, &line)) // get line info { std::cout << symbol->Name << ", " << line.FileName << ", line " << line.LineNumber; } std::cout << std::endl; }
SymCleanup(process); } };
会打印如下的输出:
1 2 3 4 5 6 7 8
MyObject::DosomethingMyObject::Dosomething, d:\documents\visual studio 2013\projects\demo\cppdemo\cppdemo.cpp, line 69 wmainwmain, d:\documents\visual studio 2013\projects\demo\cppdemo\cppdemo.cpp, line 147 __tmainCRTStartup__tmainCRTStartup, f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c,line 623 wmainCRTStartupwmainCRTStartup, f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c, line 466 BaseThreadInitThunk RtlInitializeExceptionChain RtlInitializeExceptionChain Press any key to continue . . .