我正在用-g -O0
选项编译我的Qt程序,以获得调试符号。然后我在lldb
中运行它,它在我的代码中崩溃,而不是在库中。但我得到的回溯是这样的:
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中。
您必须在启用了首次机会异常的调试器下运行应用程序,以便在首先抛出异常时中断,而不是在最后未捕获异常时中断。
在gdb
中,应该是catch throw
,用于在异常时启用断点。在lldb
中使用break set -E c++
。