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

Posted

技术标签:

【中文标题】QFileDialog::getOpenFileName 在调试时崩溃,显然是由项目名称引起的?【英文标题】:QFileDialog::getOpenFileName crashes when debugging, apparently caused by project name? 【发布时间】:2014-08-12 17:29:50 【问题描述】:

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

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

下级停止了,因为它触发了异常。

在线程 0 中停止:异常在 0x745f7736,代码:0xc0000005:读取访问冲突在:0x0,标志 = 0x0(第一次机会)。

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

然后我创建了一个基本相同的新项目。莫名其妙地,-那-奏效了。所以后来做了很多乱七八糟的事情,从我的主项目中复制东西直到它再次开始崩溃,我最终发现了问题:显然,它是 .pro 文件中的“TARGET”设置的可执行文件名称。如果它设置为 PrimeWorldEditor(我的应用程序的名称),它会崩溃。如果我将其更改为其他任何内容,它就会起作用。

所以我的第一个想法是,有些剩余文件与某处的可执行文件共享名称,从而导致问题。但是,清除 build 文件夹、重建项目以及其他任何事情都无济于事。

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

编辑:有些人要求提供代码,所以这里有一个程序崩溃的例子。再一次,这只会在目标可执行文件名称设置为 PrimeWorldEditor 的情况下运行调试器时崩溃。在其他情况下,它会按预期工作并打开 getOpenFileName() 对话框。

#include <QApplication>
#include <QFileDialog>

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    QFileDialog::getOpenFileName();
    return 0;

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

编辑 2:我想补充一点,我确实花了一段时间谷歌搜索试图找到与该问题相关的任何信息。我确实找到了几个似乎和我有同样问题的人,like this post,但这些帖子上没有任何解决方案。

【问题讨论】:

嗨,你知道它在程序中崩溃的地方吗?有时是愚蠢的错误!不要犹豫,把你的代码的一小部分。 无论何时调用 getOpenFileName(),它都会崩溃,无论它在程序中的哪个位置,并且如果它们不调用 getOpenFileName(),被调用的槽函数可以完美地工作。再加上完全相同的代码与不同的可执行文件名称完美配合的事实,这似乎表明代码没有任何问题,这就是为什么我没有在帖子中包含任何代码 sn-ps 的原因。跨度> 只有一条错误消息很难提供好的帮助。请提供一些调用getOPenFileName() 的代码。 我添加了一个代码sn-p。 你确定在没有事件循环的情况下使用QFileDialog::getOpenFileName 是安全的吗?(return a.exec();) ??? 【参考方案1】:

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

我在使用QFileDialog::getOpenFileName()时遇到程序在Visual Studio 2013 Debugger中崩溃的问题:

读取位置 0xFEEEFEEE 时访问冲突

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

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

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

我使用的是 Windows 64 位计算机,但使用 32 位运行 Qt 程序。 git 软件在 windows 资源管理器中有一个上下文菜单,不知何故这干扰了QFileDialog 并导致了问题。

【讨论】:

【参考方案2】:

呃呃呃好吧。出于某种原因,我在调用堆栈中注意到了 DropboxExt_24。所以我卸载了 Dropbox 应用,突然间,一切正常。重装了下,一切正常,问题解决了吧?

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

【讨论】:

以上是关于QFileDialog::getOpenFileName 在调试时崩溃,显然是由项目名称引起的?的主要内容,如果未能解决你的问题,请参考以下文章