在调试器中运行Qt5应用程序时如何获得堆栈跟踪?

问题描述

我正在使用-g -O0选项编译Qt程序以获取调试符号。然后,我在lldb中运行它,并在 my 代码而不是库中崩溃。但是我得到的回溯图看起来像这样:

Target 0: (mastercontrol) stopped.
(lldb) bt
* thread #1,queue = 'com.apple.main-thread',stop reason = signal SIGABRT
  * frame #0: 0x00007fff5c27f2c2 libsystem_kernel.dylib`__pthread_kill + 10
    frame #1: 0x00007fff5c33abf1 libsystem_pthread.dylib`pthread_kill + 284
    frame #2: 0x00007fff5c1e96a6 libsystem_c.dylib`abort + 127
    frame #3: 0x00007fff593c4641 libc++abi.dylib`abort_message + 231
    frame #4: 0x00007fff593c47c7 libc++abi.dylib`default_terminate_handler() + 243
    frame #5: 0x00007fff5a977eeb libobjc.A.dylib`_objc_terminate() + 105
    frame #6: 0x00007fff593d019e libc++abi.dylib`std::__terminate(void (*)()) + 8
    frame #7: 0x00007fff593c3c7e libc++abi.dylib`__cxa_rethrow + 99
    frame #8: 0x00007fff5a975e35 libobjc.A.dylib`objc_exception_rethrow + 40
    frame #9: 0x00007fff301a05ec CoreFoundation`CFRunLoopRunSpecific + 609
    frame #10: 0x00007fff2f3ff1ab HIToolBox`runcurrentEventLoopInMode + 292
    frame #11: 0x00007fff2f3feee5 HIToolBox`ReceiveNextEventCommon + 603
    frame #12: 0x00007fff2f3fec76 HIToolBox`_BlockUntilNextEventMatchingListInModeWithFilter + 64
    frame #13: 0x00007fff2d79677d AppKit`_DPSNextEvent + 1135
    frame #14: 0x00007fff2d79546b AppKit`-[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1361
    frame #15: 0x00007fff2d78f588 AppKit`-[NSApplication run] + 699
    frame #16: 0x000000012264033c libqcocoa.dylib`___lldb_unnamed_symbol693$$libqcocoa.dylib + 2652
    frame #17: 0x0000000108a9b75f QtCore`QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) + 431
    frame #18: 0x0000000108a9fb62 QtCore`QCoreApplication::exec() + 130
    frame #19: 0x000000010001b20d mastercontrol`main(argc=1,argv=0x00007ffeefbfe2a0) at master_control.cpp:108:10
    frame #20: 0x00007fff5c1443d5 libdyld.dylib`start + 1
(lldb)

即崩溃的实际位置(在我自己的代码中)没有显示

我需要如何配置CMake构建以获取实际的堆栈跟踪?

解决方法

CoreFoundation::CFRunLoopRunSpecific中而不是在QT中捕获并重新抛出了异常。

您必须在启用了first-chance-exception的调试器下运行该应用程序,以便在第一次引发异常时中断,而不是在最后一次未被捕获时中断。

gdb中,该值应为catch throw,以在异常时启用断点。在lldb中使用break set -E c++