我将Qt Creator设置为break when a C++ exception is thrown:
然后,我使用以下代码对其进行了测试:
try {
throw std::runtime_error("error");
} catch (std::exception &e) {
qDebug("%s", e.what());
}
但是它在throw std::runtime_error("error");
上没有中断。我使用的是CDB,而不是GDB的because I'm using the MSVC Kit。编辑:即使缓慢,也有another question where CDB is working for the 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解释了为什么注释失败:
最佳答案
我只写出为什么会出错,很难找到解决方法。 pastebin中的调试器跟踪说明了这个故事。
基本问题是调试器与QT前端之间的通信相当差。而且在您的情况下,它不同步,QT的等待时间不足以使调试器完成命令。 QT尝试在msvcr90d.dll!__CxxThrowException@8
函数上设置一个断点,该函数在Microsoft CRT中引发C++异常。如果程序使用多个CRT,则此功能可以存在于多个可执行文件中。一个很常见的事故,是由/ MT引起的。如果您使用的是隔离良好的DLL(通过COM与之交互),则有时是有意的。
正如您可能想象的那样,这需要花费一段时间,因为链接的问题中存在问题,调试器必须为每个已加载的DLL遍历符号信息。如果需要从符号服务器上下载DLL的PDB,并且不进行缓存,则将花费特别长的时间,因此下次调试时可用。不是您的问题,它确实将缓存位置设置为C:\ Users \ sasho \ AppData \ Local \ Temp \ symbolcache。去看看看看是否可以在其中看到操作系统DLL的PDB。
此操作非常棘手,调试器无法很好地表明已完成搜索DLL。 QT要做的是对照调试器的反馈,以验证所获得的DLL列表。它不会这样做,它会在调试器完成搜索之前发出g
命令。超时可能太短,但实际上看起来QT不能指望调试器在后台执行此命令。给人类带来的便利,在这里并不是很有帮助:)
应该有一种配置CDB使其不在后台执行此搜索的方法。这是隐藏的,我在debugger.chm帮助文件中看不到任何内容,但可能有一段时间没有更新了。 Google也不帮助。我建议您问一个问题。最重要的也许是您在版本号上存在很大的不匹配。您使用的编译器是2008 vintage,调试器是相当新的SDK 8.0版本,我无法确定您使用的QT版本。
因此,一种可能的解决方法是有意使用较旧版本的CDB,该版本更可能已通过您使用的QT前端版本进行了测试。下载相应的SDK版本,版本6.0与VS2008时限相匹配。我认为“Windows调试工具”当时仍是单独下载,尚未包含在SDK中。另一个解决方法是停止依赖友好的QT前端,并从命令提示符处学习驱动CDB。 WINDBG更为有用,它使用相同的调试引擎,但具有GUI界面。适度,它仍然主要是即时驱动的。但是,您确实会损失几天的时间来学习这些命令。使调试器在引发异常时中断很简单,请使用sxe
命令。