Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt创建者可以';t在抛出异常时中断(将CDB用作调试器时)_C++_Debugging_Qt Creator_Windbg_Breakpoints - Fatal编程技术网

C++ Qt创建者可以';t在抛出异常时中断(将CDB用作调试器时)

C++ Qt创建者可以';t在抛出异常时中断(将CDB用作调试器时),c++,debugging,qt-creator,windbg,breakpoints,C++,Debugging,Qt Creator,Windbg,Breakpoints,我将Qt Creator设置为: 然后,我用以下代码对其进行了测试: try { throw std::runtime_error("error"); } catch (std::exception &e) { qDebug("%s", e.what()); } 但它并没有在抛出std::runtime_错误(“错误”)时中断。我用的是CDB,不是GDB 编辑:即使速度很慢,也有。因此,原则上应该是可行的。我的配置是:Qt Cr

我将Qt Creator设置为:

然后,我用以下代码对其进行了测试:

try {
    throw std::runtime_error("error");
} catch (std::exception &e) {
    qDebug("%s", e.what());
}
但它并没有在抛出std::runtime_错误(“错误”)时中断。我用的是CDB,不是GDB

编辑:即使速度很慢,也有。因此,原则上应该是可行的。我的配置是:Qt Creator 3.3.0,用Qt4/MSVC 9.0(x86)编译,调试器是cdb6.2.9200.16384

编辑2:这是我在CDB日志窗口中看到的内容(我在有断点和没有断点的CDB日志之间进行了区分):


完整的CDB日志(如果需要):

编辑3:@HansPassant's在评论中解释了它失败的原因:


请记住,您使用的是非常旧的MSVC++版本,VS2012有很大的变化。pastebin显示它严重不同步,无法访问包含的DLL__CxxThrowException@8(MSVCR90D.dll),然后引发异常。sxe调试器命令很简单,在抛出任何异常时自动中断。。也许你根本不应该使用QT的UI,它看起来太简陋了汉斯·帕桑10小时前


只要看看跟踪,调试器就会显示它正在搜索的DLL是什么“CxxThrowException”。它永远无法访问msvcr90d.dll。异常在搜索符号时抛出,在此符号之后所有异常都结束。完全不同步汉斯·帕桑56分钟前


我会写下为什么会出问题,很难找到解决办法。pastebin中的调试器跟踪说明了这一点

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

正如您可能想象的那样,这需要一段时间,在链接的问题中,调试器必须仔细检查加载的每个DLL的符号信息。如果DLL的PDB需要从symbol服务器下载,并且没有缓存,则需要特别长的时间才能在下次调试时使用。不是您的问题afaict,它会将缓存位置设置为C:\Users\sasho\AppData\Local\Temp\symbolcache。去看看,确认您确实看到了操作系统DLL的PDB

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

应该有一种方法来配置CDB,使其不在后台执行此搜索。这是隐藏得很好的,我在debugger.chm帮助文件中没有看到任何内容,但它可能在一段时间内没有更新。谷歌也帮不上忙。我建议你问个问题。最重要的可能是,您在版本号上有一个相当大的不匹配。您使用的编译器是2008年份的,调试器是全新的,SDK 8.0版本,我不知道您使用的是什么QT版本


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

您确定CDB支持它吗?好的,只需简单说明Qt Creator是否支持CDB的此功能。如果调试器需要一个功能来实现这一点,那么我的意思可能是两者都有。我刚刚发现-,它正在工作(尽管速度很慢),至少对于这个家伙的设置来说是这样的。因此,CDB和Qt Creator似乎都应该支持这一点。但是,我不知道为什么它对我不起作用。请记住,您使用的是非常旧的MSVC++版本,VS2012有很大的变化。pastebin显示它严重不同步,无法访问包含的DLL__CxxThrowException@8(MSVCR90D.dll),然后引发异常。使用
sxe
debugger命令很简单,在抛出任何异常时自动中断。。也许你根本不应该使用QT的UI,它看起来太简陋了。只要看看跟踪,调试器就会显示它正在搜索的DLL是什么“CxxThrowException”。它永远无法访问msvcr90d.dll。异常在搜索符号时抛出,在此符号之后所有异常都结束。完全不同步。pdb确实位于
c:\Users\saso\AppData\Local\Temp\symbolcache\msvcr90d.i386.pdb\269DF420EA5F4A06B5C84447F4A0C7F71\msvcr90d.i386.pdb
我尝试了CDB6.12,但它仍然没有在异常情况下中断。然而,它不再说“DLL中的非限定符号”。我在Nice try上传了日志,但问题完全相同,它仍然发出
g
命令fart t
<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'.