如何解决在调试器中运行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++
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。