QFileDialog::getOpenFileName在调试时崩溃,显然是由项目名称引起的

QFileDialog::getOpenFileName crashes when debugging, apparently caused by project name?

本文关键字:项目 调试 getOpenFileName 崩溃 QFileDialog      更新时间:2023-10-16

我遇到了一个让我很困惑的问题。我使用Qt Creator 3.1.2,在Windows 7上使用Qt 5.3,使用MSVC 10.0编译器和来自Windows 8.1调试工具的CDB。(不确定我是否应该寻找一个Windows 7特定的调试器,但直到现在我还没有遇到任何问题)。

问题:当我尝试在调试时使用QFileDialog::getOpenFileName()时,程序抛出异常。

触发异常,下级停止运行。

在线程0被:Exception at 0x745f7736,代码:0xc0000005: read access violation at: 0x0, flags=0x0(第一次机会)。

发布/调试版本无关紧要。如果我正在运行调试器,它会崩溃。如果我没有,它就会起作用。我尝试了很多不同的东西来试图弄清楚为什么会发生这种情况——我将getOpenFileName移动到程序的不同部分,我尝试更改/删除函数调用的参数,我基本上剥离了所有的代码,除了显示这个文件对话框所需的最低限度的代码——一个QApplication和一个主窗口,当菜单栏项被单击时调用getOpenFileName()。毫无效果。

然后我创建了一个基本相同的新项目。令人费解的是,那起作用了。所以后来我做了很多事情,从我的主要项目中复制东西,直到它再次崩溃,我最终发现了问题:显然,这是.pro文件中由"TARGET"设置的可执行文件名。如果它被设置为PrimeWorldEditor(我的应用程序的名称),它会崩溃。如果我把它改成别的,它就能工作了。

所以我的第一个想法是有一些剩余的文件与可执行文件共享它们的名字,从而导致问题。但是,清除构建文件夹、重新构建项目和其他任何操作都没有帮助。

我在这一点上,我已经用尽了什么可能导致这个问题的想法,我已经尝试过,但未能通过搜索找到任何其他文件,要么与可执行文件共享他们的名字,要么指向它。如果有人知道是什么问题,我将非常感谢帮助。我现在可以通过更改可执行文件的名称来解决这个问题,但我真的很想找出为什么会发生这种情况并修复它。

编辑:一些人要求提供代码,所以这里有一个程序崩溃的例子。同样,只有在运行调试器并将目标可执行文件名设置为PrimeWorldEditor时才会崩溃。在其他情况下,它按预期工作并打开getOpenFileName()对话框。
#include <QApplication>
#include <QFileDialog>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFileDialog::getOpenFileName();
    return 0;
}

我认为这个问题可能与我的设置有关,所以我不确定它是否容易重复。

编辑2:我想补充一点,我确实花了一些时间在谷歌上搜索,试图找到与这个问题相关的任何信息。我确实发现了一些人和我有同样的问题,就像这篇文章一样,但是在这些帖子上没有任何解决方案。

我也有同样的问题,解决方法是卸载git软件,它在windows资源管理器中创建了上下文菜单。

我得到的问题是,程序崩溃在Visual Studio 2013调试器时使用QFileDialog::getOpenFileName():

读取位置0xFEEEFEEE时访问冲突

当我在没有调试器的情况下运行程序或在项目配置中设置组合上下文选项时,它没有崩溃->调试器->combine with environment = "No".

我重新安装了Visual Studio和Qt,但没有任何帮助。

最后,我删除了当天安装的git软件,并卸载了该软件;然后程序在调试器中不再崩溃。

我用的是64位的Windows电脑,但是用32位运行Qt程序。git软件在windows资源管理器中有一个上下文菜单,不知怎么的,它干扰了QFileDialog,导致了这个问题。

哇。由于某种原因,我在调用堆栈中注意到DropboxExt_24。于是我卸载了Dropbox应用程序,突然间,一切都恢复正常了。重新安装了,一切都还能用,问题解决了吧?

我一直把我的代码托管在Dropbox上,以保持它的备份,不确定这是否与问题有关。