2017-08-17 288 views
0

我试图找出我的Qt应用程序崩溃的原因,调试不包含很多信息,因此很难找到原因。在使用断点后,我发现最接近崩溃的线路可能是w.show()调用(应用程序的GUI在任何按钮或任何按钮出现之前都会冻结)。我的主要功能是正是这一点:Qt应用程序在启动时崩溃在MainWindow.Show()调用

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 

    // disable Window's maxminize button 
    const Qt::WindowFlags flags = w.windowFlags()^Qt::WindowMaximizeButtonHint; 
    w.setWindowFlags(flags); 
    w.show(); 
    return a.exec(); 
} 

达到所在行w.show()时,在应用程序启动(但不正常,GUI frooze,正如我前面提到的),并在几分钟后,我得到了一个段错误和调试器是这样的:

enter image description here

我该如何解决这个问题?我在这已经有几天了,试图让调试器提供更多的信息,以便我可以追溯到SEGFAULT的原因,但没有这样的调试器信息,我不知道该怎么做。

我的Qt版本:

enter image description here

回答

0

实测溶液:

// disable Window's maximize button (use bitwise [and-not]&~ and not [xor]^) 
const Qt::WindowFlags flags = w.windowFlags() &~ Qt::WindowMaximizeButtonHint; 
w.setWindowFlags(flags); 

,或者相同的效果可以通过以下方式实现!

希望它与同样的问题有用的人:

在调试消息我发现了坠毁是由GBIEH.dll DLL的结果。谷歌搜索它,我发现它与网上银行有关(我想当我的应用程序试图使用该DLL的IB应用程序将此作为一种攻击,因此崩溃,我的猜测)。我刚刚删除了网上银行的程序和应用程序工作正常。

0

有解决这样的问题的各种方式,假设你不能提供一个MCVE:由一个

  • 地带的主窗口一个元素,首先从构造函数中,看看造成崩溃的原因
  • 如果从构造函数中剥离元素有帮助,然后恢复它的一部分,然后运行调试器到stu dy导致冻结的原因
  • 请记住,冻结GUI程序通常意味着事件循环被阻止。如果您在任何地方拨打QApplication::processEvents(),请考虑删除它。最后,如果一切都失败了,你将不得不去linux系统,并在调试模式下重新编译Qt(debug + release从来没有为我工作过),跟踪事件循环并在代码中看到什么会冻结你的GUI。

我推荐Linux的原因是因为gdb很棒,而cdb在这方面很糟糕。如果你有VS企业,你也可以尝试它的调试器。

祝你好运。

+0

我已经通过在构造函数的每一行中放置一个断点来尝试#1,它已到达构造函数的罚款结束。所以错误不存在。 #2:与#1相同。 #3我不会在应用程序启动时调用它。所以我想它也不会。 #4感谢提示,如果我花更多时间在这个上,我会尝试在Linux上。 #5:我现在试着连接到vs调试器。再次感谢! – Jack

0

的原代码的部分,其具有一个问题(固定):

w.setWindowFlag(Qt::WindowMaximizeButtonHint, false); 
+0

感谢您的修复。但'w.setWindowFlag()'没有发现错误。你正在使用哪个Qt版本? – Jack

+0

我在Mac和Linux上使用Qt 5.7和5.9(可能与您的问题无关)。这条线是不正确的,没有给你你想要的东西。我无法知道你系统中的某个地方的GBIEH.dll。多年来,在Windows上执行Qt应用程序永远不会运行,代码很简单,只有一个明显的错误(尽管不会导致崩溃)。 – AlexanderVX