Qt Creator 和 MSVC - 在调试时忽略特定的异常类型?

Posted

技术标签:

【中文标题】Qt Creator 和 MSVC - 在调试时忽略特定的异常类型?【英文标题】:Qt Creator and MSVC - Ignoring specific exception types on debugging? 【发布时间】:2017-11-30 08:01:27 【问题描述】:

我目前正在使用 Qt Creator 4.4.1Qt 5.9.2MSVC 2015 32/64 位编译器来创建Windows 7 上的 DLL。

在Qt Creator下

项目 -> 构建和运行 -> 桌面Qt 5.9.2 MSVC2015 xx -> 运行 -> 可执行文件

我已经指定了加载我的 DLL 的主机应用程序,所以当我点击 F5 时,这个应用程序会被执行并毫无缺陷地加载我的 DLL。

但是,在加载时,主应用程序引发了一个我没有动手的异常,使得 Qt Creator 显示一个包含以下内容的消息框:

下级停止了,因为它触发了异常。 在线程 0 中停止的原因是:0x60251637 处的异常,代码 0xc0000005:写访问冲突:0x1,标志 = 0x0(第一次机会)。

我现在必须关闭消息框并再次按 F5 才能继续。

因为我必须为每次测试运行一次又一次地这样做,这真的很烦人。那么,有没有一种最简单的方法来告诉 Qt Creator 的 CDB只忽略特定类型的异常?

【问题讨论】:

忽略异常是你能做的最糟糕的事情。对我来说,这听起来像是在启动过程中死掉了。 (可能是 DLL 无法初始化。)我会更深入地了解发生了什么,例如分离应用程序的部分并检查异常是否仍然存在,使用 Dependency Walker 来了解实际拉入了哪些 DLL,等等。也许,你可以隔离一些你甚至不需要的东西。可能是,你没有正确初始化一些东西...... 这是一个类似的问题:SO: The inferior stopped because it triggered an exception. Stopped in thread 0 by Exception…? 我通过谷歌搜索“劣质停止,因为它触发了异常”找到了这个和其他。 一般注意事项:我讨厌仅在发布时偶尔出现的错误。这可能是由未初始化的 POD 变量引起的。当 VS 在调试模式下将测试位模式写入任何分配的内存(甚至在堆栈上)时,实际上在调试模式下没有未初始化的变量。大多数情况下,它会有所帮助,但对于某些事情(例如,bools 总是 true 因此)它会适得其反。调试模式下的可重现错误(如您的问题中所述)听起来像是与之相反的幸运案例。 “加载我的 DLL 没有缺陷”和“访问 vilation”似乎自相矛盾。 【参考方案1】:

查看调用堆栈,找到相关代码,看看它做了什么。您应该在该行周围找到try ... catch ...。看看您是否可以通过某种方式避免异常,通常是通过引入if ... else ...

如果您无法避免它,并且您确保忽略它确实安全,请使用命令行参数-c "sxn c0000005" 或等效的-c "sxn av" 启动 CDB,其中 AV 是“访问冲突”的缩写。您可以使用sx 查看所有异常设置。

【讨论】:

【参考方案2】:

我也遇到了同样的问题,问题可能是变量没有初始化造成的,例如:

QLable *lable;

如果忘记给这个变量分配内存,就会导致这个错误。

lable = new QLable(this);

我认为你应该检查你的变量。

【讨论】:

以上是关于Qt Creator 和 MSVC - 在调试时忽略特定的异常类型?的主要内容,如果未能解决你的问题,请参考以下文章

带有 Qt 5 和 Qt Creator 的 msvc2013

在 Windows 上使用 Qt Creator 进行调试时未显示 QStrings

如何在 qt creator 中为 cdb 编写调试助手?

Win 10 上的 QT Creator,“无法检索 MSVC 环境”

Qt 5.7 版本+2013VS环境配置

Qt Creator 2.6.1 + Qt 5 + C++11 + MSVC2010 编译器