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.1 与 Qt 5.9.2 和 MSVC 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 在调试模式下将测试位模式写入任何分配的内存(甚至在堆栈上)时,实际上在调试模式下没有未初始化的变量。大多数情况下,它会有所帮助,但对于某些事情(例如,bool
s 总是 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