Qt Creator无法中断抛出的异常(当使用CDB作为调试器时)

时间:2015-02-10 09:12:01

标签: c++ debugging qt-creator windbg breakpoints

我将Qt Creator设置为break when a C++ exception is thrown

enter image description here

然后我用这段代码测试了它:

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解释了为什么它在评论中失败了:

  

请记住,您使用的是非常旧版本的MSVC ++,VS2012的重大变化。 pastebin显示它非常不同步,在抛出异常之前永远不会到达包含__CxxThrowException @ 8(MSVCR90D.dll)的DLL。使用sxe调试器命令很简单,当抛出任何异常时自动中断。也许你根本不应该使用QT的UI,它看起来太傻了。 - Hans Passant 10小时前

     

只需查看跟踪,调试器就会显示它正在搜索的DLL&#34; CxxThrowException&#34;。它永远不会到达msvcr90d.dll。并且在搜索符号之后抛出异常,之后全部结束。完全不同步。 - Hans Passant 56分钟前

1 个答案:

答案 0 :(得分:1)

我只是写下为什么会出错,解决方法很难找到。 pastebin中的调试器跟踪告诉故事。

基本问题是调试器和QT前端之间的通信相当差。在你的情况下,它不同步,QT没有等待足够长的时间让调试器完成命令。 QT尝试在msvcr90d.dll!__CxxThrowException@8函数上设置断点,该函数在Microsoft CRT中引发C ++异常。如果程序使用多个CRT,则此函数可以存在于多个可执行文件中。一个非常常见的事故,由/ MT构建引起。如果您使用通过使用COM接口的隔离良好的DLL,有时会有意。

这可能需要一段时间,正如您可能想象的那样,在链接问题中的抱怨,调试器必须浏览每个加载的DLL的符号信息。如果DLL的PDB需要从符号服务器下载并且不以其他方式缓存以便在下次调试时可用,则需要特别长的时间。不是你的问题,它确实将缓存位置设置为C:\ Users \ sasho \ AppData \ Local \ Temp \ symbolcache。去看看 - 验证你确实看到那里的操作系统DLL的PDB。

这个操作很棘手,调试器没有给出一个好的信号,它已经完成了搜索DLL。 QT 应该做的是验证调试器对它获得的DLL列表的反馈。它没有这样做,它在调试器完成搜索之前发出g命令。可能是一个太短的超时但实际上看起来QT并不指望在后台执行此命令的调试器。对人类来说很方便,这里不是很有帮助:))

应该有一种方法可以将CDB配置为不在后台执行此搜索。这是隐藏的,我在debugger.chm帮助文件中看不到任何内容,但它可能暂时没有更新。谷歌也没有帮助。我建议你问一个问题。最重要的可能是版本号中存在相当大的不匹配。您使用的编译器是2008年份,调试器是相当新的,SDK 8.0版本,我无法告诉您使用的QT版本。

因此,一种可能的解决方法是故意使用较旧版本的CDB,这种CDB更有可能使用您使用的QT前端版本进行测试。下载相应的SDK版本,版本6.0与VS2008时间帧匹配。我认为&#34; Windows调试工具&#34;当时仍然是一个单独的下载,但尚未包含在SDK中。另一个解决方法是停止依赖友好的QT前端并学习从命令提示符驱动CDB。中等更有用的是WINDBG,使用相同的调试引擎但具有GUI界面。只是温和,它仍然主要是迅速驱动。然而,你确实失去了几天的学习命令。抛出异常时让调试器中断是微不足道的,使用sxe命令。