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

标签 c++ qt debugging getopenfilename

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

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

The inferior stopped because it triggered an exception.

Stopped in thread 0 by: Exception at 0x745f7736, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance).

发布/调试版本无关紧要。如果我正在运行调试器,它会崩溃。如果我不是,它会起作用。我尝试了很多不同的方法来弄清楚为什么会这样——我将 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:我想补充一点,我确实花了一段时间谷歌搜索来尝试找到与该问题相关的任何信息。我确实找到了几个人,他们似乎和我有同样的问题,like this post ,但这些帖子上没有任何解决方案。

最佳答案

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

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

Access Violation while reading position 0xFEEEFEEE

当我在没有调试器的情况下运行程序或者当我在项目配置 -> 调试器 -> 中设置 combine Context 选项时,它没有崩溃 结合环境=“否”。

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

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

我使用的是 Windows 64 位计算机,但使用 32 位运行 Qt 程序。 git 软件在 Windows 资源管理器中有一个上下文菜单,这会以某种方式干扰 QFileDialog 并导致问题。

关于c++ - QFileDialog::getOpenFileName 调试时崩溃,显然是由项目名称引起的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25270513/

相关文章:

c++ - 删除 QMap 的前 5 个元素

android - 如何在eclipse中调试子项目中的Intent

c++ - GDB:运行没有符号的cpp进程调试

c++ - 返回 null 还是抛出异常?

java - Eclipse - 无法在 Java API 类中安装断点

c++ - 检查 switch 语句中的字符串结尾

使用带有虚函数的协变返回类型的 C++ 无效转换错误

c++ - 如何检测 Windows 系统托盘的变化?

c++ - 与 32 位和 64 位应用程序相同源的条件编译

c++ - 窗口的排列顺序