C++ 如何在windows上正确实施CaptureStackBackTrace

C++ 如何在windows上正确实施CaptureStackBackTrace,c++,windows,stack,C++,Windows,Stack,有一种方法可以在MS windows上检索堆栈跟踪: 我尝试在我的应用程序(不仅在Windows上运行)中使用以下方法实现此功能: #elif defined HUGGLE_WIN result = ""; unsigned int i; void *stack[HUGGLE_STACK]; unsigned short frames; SYMBOL_INFO *symbol; HANDLE process

有一种方法可以在MS windows上检索堆栈跟踪:

我尝试在我的应用程序(不仅在Windows上运行)中使用以下方法实现此功能:

#elif defined HUGGLE_WIN
    result = "";
    unsigned int   i;
    void          *stack[HUGGLE_STACK];
    unsigned short frames;
    SYMBOL_INFO   *symbol;
    HANDLE         process;
    process = GetCurrentProcess();
    SymInitialize( process, NULL, TRUE );
    frames               = CaptureStackBackTrace( 0, HUGGLE_STACK, stack, NULL );
    symbol               = ( SYMBOL_INFO * )calloc( sizeof( SYMBOL_INFO ) + 256 * sizeof( char ), 1 );
    symbol->MaxNameLen   = 255;
    symbol->SizeOfStruct = sizeof( SYMBOL_INFO );
    for( i = 0; i < frames; i++ )
    {
        SymFromAddr( process, ( DWORD64 )( stack[ i ] ), 0, symbol );
        QString symbol_name = "unknown symbol";
        if (!QString(symbol->Name).isEmpty())
        symbol_name = QString(symbol->Name);
        result += QString(QString::number(frames - i - 1) + QString(" ") + symbol_name + QString(" 0x") +
                          QString::number(symbol->Address, 16) + QString("\n"));
    }
    free( symbol );
#else

这5个未知数是我程序中的函数。为什么我看不到它们?

请注意,MS DbgHelp.dll中的符号解析可能不适用于gcc(MinGW)程序。GCC工具附带了一个单独的工具“addr2line”,在这里应该会有所帮助

到目前为止,Qt DLL只提供了导出的符号。仅对于本机Windows DLL,未混合的符号才可见。 您的程序是否导出符号?(例如,exe通常不导出符号。)您也可以尝试将代码移动到带有导出符号的DLL中,以至少看到这些符号-尽管如此


还向我们显示输出中堆栈[i]的内容。

没有可用或加载的调试符号?我在发布和调试模式下都尝试过这一点,现在我正在Visual Studio中尝试,我最终会根据结果更新它。这是在使用MinGW时发布的。是的,在Visual Studio中它按预期工作,我想我当时的MinGW配置中一定有问题,或者其他什么:/I我使用Qtcreator编译它,但在那里它不工作
34 unknown symbol 0x0
33 unknown symbol 0x0
32 unknown symbol 0x0
31 unknown symbol 0x0
30 unknown symbol 0x0
29 ZN11QMetaObject8activateEP7QObjectiiPPv 0x6b954a50
28 ZN11QMetaObject8activateEP7QObjectPKS_iPPv 0x6b95495e
27 ZN6QTimer7timeoutENS_14QPrivateSignalE 0x6b9ad018
26 ZN6QTimer10timerEventEP11QTimerEvent 0x6b9588ea
25 ZN7QObject5eventEP6QEvent 0x6b94f3fc
24 ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent 0x2259ddfe
23 ZN12QApplication6notifyEP7QObjectP6QEvent 0x2259b4a4
22 ZN12QApplication6notifyEP7QObjectP6QEvent 0x2259b4a4
21 ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent 0x6b929e6c
20 ZN16QCoreApplication9sendEventEP7QObjectP6QEvent 0x6b9cf5ac
19 ZN28QEventDispatcherWin32Private14sendTimerEventEi 0x6b97904c
18 ZN28QEventDispatcherWin32Private21activateEventNotifierEP17QWinEventNotifier 0x6b978260
17 gapfnScSendMessage 0x76305fc8
16 GetThreadDesktop 0x76306c63
15 CharPrevW 0x7630768c
14 DispatchMessageW 0x7630787b
13 ZN21QEventDispatcherWin3213processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE 0x6b979682
12 ZN21QEventDispatcherWin3213processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE 0x6b979682
11 ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEE 0x6b927f3c
10 ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE 0x6b9280ec
9 ZN16QCoreApplication4execEv 0x6b92a3dc
8 ZN15QGuiApplication4execEv 0x4606506
7 ZN12QApplication4execEv 0x2259b34a
6 ZN12QApplication4execEv 0x2259b34a
5 ZN12QApplication4execEv 0x2259b34a
4 ZN12QApplication4execEv 0x2259b34a
3 ZN12QApplication4execEv 0x2259b34a
2 BaseThreadInitThunk 0x76633378
1 RtlInitializeExceptionChain 0x778dbecf
0 RtlInitializeExceptionChain 0x778dbecf