我将Qt Creator设置为在C++异常被抛出时中断:
然后我用这段代码进行了测试:
try {
throw std::runtime_error("error");
} catch (std::exception &e) {
qDebug("%s", e.what());
}
但是它没有在throw std::runtime_error("error");
处中断。我正在使用CDB,而不是GDB,因为我正在使用MSVC Kit。
编辑: 这里还有另一个问题,CDB对于该OP虽然速度较慢,但仍能正常工作。所以原则上应该可以工作。我的配置是:Qt Creator 3.3.0,使用Qt4/MSVC 9.0(x86)进行编译,调试器是CDB 6.2.9200.16384。
编辑2: 这是我在CDB日志窗口中收到的内容(我在带有断点和不带断点的CDB日志之间进行了比较):
<bu100400 CxxThrowException
<!qtcreatorcdbext.breakpoints -t 1 -v
<!qtcreatorcdbext.pid -t 2
dATTEMPT SYNC
d*** Bp expression 'CxxThrowException' contains symbols not qualified with module name.
1 breakpoint(s) pending...
*** Unable to resolve unqualified symbol in Bp expression 'CxxThrowException' from module 'C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.18201_none_ec80f00e8593ece5\comctl32.dll'.
完整的CDB日志(如有需要):http://pastebin.com/jhNRy9bE
编辑3:@HansPassant在评论中解释了为什么它失败:
请记住,您正在使用非常旧的MSVC ++版本,VS2012进行了重大更改。 pastebin显示它与__CxxThrowException @ 8(MSVCR90D.dll)包含的DLL非常不同步,在抛出异常之前从未到达该DLL。使用sxe调试器命令很简单,任何异常抛出时都会自动中断..也许您根本不应该使用QT的UI,它看起来太笨重了。- Hans Passant 10小时前
只需查看跟踪,调试器就会显示它正在搜索哪些DLL以获取“CxxThrowException”。它永远不会到达msvcr90d.dll。而异常是在搜索符号后抛出的,此后一切都结束了。完全不同步。- Hans Passant 56分钟前
sxe
调试器命令很简单,当抛出任何异常时自动中断。也许您根本不应该使用QT的UI,它看起来太过陈旧。 - Hans Passant