如何在msvc++中获得相当c#风格的堆栈跟踪?

How do you get a fairly C#-esque stack trace in MSVC++?

本文关键字:风格 堆栈 跟踪 msvc++      更新时间:2023-10-16

在c#中,您可以获得以下类型的堆栈跟踪:

   at ExceptionGenerator.Program.three() in c:UsersADIMADocumentsVisual Stud
io 2013ProjectsExceptionGeneratorExceptionGeneratorProgram.cs:line 36
   at ExceptionGenerator.Program.two() in c:UsersADIMADocumentsVisual Studio
 2013ProjectsExceptionGeneratorExceptionGeneratorProgram.cs:line 31
   at ExceptionGenerator.Program.one() in c:UsersADIMADocumentsVisual Studio
 2013ProjectsExceptionGeneratorExceptionGeneratorProgram.cs:line 26
   at ExceptionGenerator.Program.Main(String[] args) in c:UsersADIMADocuments
Visual Studio 2013ProjectsExceptionGeneratorExceptionGeneratorProgram.cs:li
ne 15

我想在c++中做同样的事情,但我不确定两件事…如何获得文件以及所处的行号?

示例代码我已经工作到目前为止:

// StackTracing.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <process.h>
#include <iostream>
#include <Windows.h>
#include "dbghelp.h"
using namespace std;
int LogStackTrace()
{
    void            *stack[100];
    WORD            numberOfFrames;
    SYMBOL_INFO     *symbol;
    HANDLE          process;
    process = GetCurrentProcess();
    SymInitialize(process, NULL, TRUE);
    numberOfFrames = CaptureStackBackTrace(0, 1000, stack, NULL);
    symbol = (SYMBOL_INFO *)calloc(sizeof(SYMBOL_INFO)+256 * sizeof(char), 1); 
    symbol->MaxNameLen = 255;
    symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
    printf("Caught exception ");
    for (int i = 0; i < numberOfFrames; i++)
    {
        SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol);
        printf("at %s, address 0x%0Xn", symbol->Name, symbol->Address);
    }
    return 0;
}
void function2()
{
    throw new exception("Expected exception.");
}
void function1()
{
    function2();
}
void function0()
{
    function1();
}
static void threadFunction(void *param)
{
    try
    {
        function0();
    }
    catch (...)
    {
        LogStackTrace();
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    try
    {
        _beginthread(threadFunction, 0, NULL);
    }
    catch (...)
    {
        LogStackTrace();
    }
    printf("Press any key to exit.n");
    cin.get();
    return 0;
}
输出:

Press any key to exit.
Caught exception at LogStackTrace, address 0xB13860
at threadFunction, address 0xB15680
at beginthread, address 0xFCF31E0
at endthread, address 0xFCF33E0
at BaseThreadInitThunk, address 0x7656494F
at RtlInitializeExceptionChain, address 0x772E986A
at RtlInitializeExceptionChain, address 0x772E986A

也许堆栈框架类在这里可以帮到你。