Qt 应用程序在启动期间抛出访问冲突异常

Posted

技术标签:

【中文标题】Qt 应用程序在启动期间抛出访问冲突异常【英文标题】:Qt Application throws an Access violation exception during startup 【发布时间】:2013-03-06 17:17:32 【问题描述】:

我有一个可以在调试模式下正常工作的 Qt 应用程序,没有任何问题。两天以来,我试图让它在发布模式下工作。经过一些项目属性修改后,我设法编译没有错误。但不幸的是,应用程序在到达 main 方法之前就崩溃了。 这就是我的环境:

MS VS 2010 Qt 4.8.4 Qwt 6.0.0

我不知道这是否相关,但我还为 VS 安装了 Qt 插件并使用 Qt Designer 来创建我的 GUI。

正如我在调试模式中所说,没有问题。从 Visual Studio 启动发行版会产生以下错误: Application.exe 中 0x77c415de 处未处理的异常:0xC0000005:访问冲突读取位置 0x0000000c。

我可以“调试”的最后一个函数是方法“__declspec(noinline) int __tmainCRTStartup”中调用的“WinMain”方法,该方法位于 crtexe.c 中(老实说,我不知道这是什么)。调用堆栈如下所示:

ntdll.dll!77c415de()    
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!77c415de()    
ntdll.dll!77c3014e()    
msvcr100.dll!718f0269()     
msvcr100.dll!718f233b()     
msvcr100.dll!718f233b()     
msvcr100.dll!718f233b()     
QtCore4.dll!5b2cfc49()  
QtGui4.dll!57bf54ea()   
Application.exe!__tmainCRTStartup()  Line 547 + 0x1c bytes  C
kernel32.dll!754633aa()     
ntdll.dll!77c59ef2()    
ntdll.dll!77c59ec5()    

此刻我完全被这个问题迷失了。不知道要进一步尝试什么...

我尝试减少程序并注释掉完整的主要功能。但结果是相同的行为。正如我所说,错误甚至在调用主函数之前就发生了。我也关闭了所有优化并重新编译...没有改变任何东西。

让我完全困惑的是,当我从命令提示符调用“Application.exe”时它“工作”(好吧,它也崩溃了,但在执行过程中要晚得多)。很奇怪,不是吗?从命令提示符开始和从 Visual Studio 应用程序开始有什么区别?

【问题讨论】:

尝试使用dependencywalker.com 来分析可执行文件的依赖关系。可能原因是混合运行时。让我们检查一下。 还要检查你的PATH,可能有其他版本引用qt运行时的路径 感谢 AnatolyS 的帮助。我已经从 PATH 系统变量中删除了所有 qt 路径。但没有变化。我还安装了dependencywalker,但不知道如何在那里启动“VS 启动应用程序”。所以我只打开了Application.exe。它说缺少两个 dll:GPSVC.dll、IESHIMS.DLL。不知道这是否相关。明天我会寻找这些DLL。现在必须停下来...... 【参考方案1】:

AnatolyS 和 npiau 感谢您的提示。与此同时,我继续挖掘我的代码。或多或少我从一开始就开始了,最后得到了错误发生的地方。我想 npiau 是对的,它与 Qt 无关。

这仍然是(对我来说)一个奇怪的问题。我在一个新线程中发布了它(因为它与这个线程关系不大):C++ Creation of a Singleton object in initializer list causes an Access Violation (only Release Mode)

【讨论】:

【参考方案2】:

问题不在于 QT,而在于您的源代码。 “0xC0000005:访问冲突读取位置0x0000000c”表示您尝试访问错误的内存位置。

检查你的数组和指针。

【讨论】:

以上是关于Qt 应用程序在启动期间抛出访问冲突异常的主要内容,如果未能解决你的问题,请参考以下文章

C++ Battle4Zion 项目抛出未处理的异常:读取访问冲突。 **this** 是 nullptr。发生了

PeekMessage() 抛出未处理的异常(访问冲突)

捕获访问冲突异常?

Qt 5.5 和 OpenGL:尝试调用 paintGL() 时引发读取访问冲突异常

VB访问冲突错误

抛出异常:读取访问冲突。这是0xBF13D000