2017-10-19 121 views
1

我使用Qt5.9,一个简单的检查:Qt SIGABRT替代消息?

 assert(pobjNode != NULL); 

将导致显示Qt的信号接收错误对话框,它没有给出任何关于问题出在哪里或什么是任何有用的信息。

有没有办法用一些更有用的东西来替代这些无用的信息?

我在想的是一种设置对话框的方法,以显示出现错误时可能出现的错误。

+0

在哪个操作系统上?为什么使用'gdb'调试器是不够的? –

+0

Ubuntu,我不想使用调试器来处理所有事情......它更容易抛出断言并运行应用程序。 – SPlatten

回答

1

Q_ASSERT是一个自定义断言宏,它可以增强标准的assert函数。

该错误消息由qFatal()处理,它在某些平台上的行为可能会比标准断言宏好一些。例如,在Windows上,它将在断言失败的位置触发Visual Studio调试器,而不是仅调用abort()

您还可以重定向 Qt错误消息的输出功能,如qFatal到您的自定义消息处理程序(与qInstallMessageHandler())。例如,如果您想将错误消息重定向到一个文件,它会很有用。

还要注意的是Q_ASSERT是禁用宏QT_NO_DEBUG(而assertNDEBUG禁用):这可以用来分隔您的断言Qt的相关代码和休息之间。

Q_ASSERT_X打印信息与位置一起,源文件名和行号如果测试是错误的。 打印邮件的内容以及测试的源文件名和行号是否为false的位置。 实施例:

// File: div.cpp 
    #include <QtGlobal> 
    int divide(int a, int b) 
     { 
      Q_ASSERT_X(b != 0, "divide", "division by zero"); 
      return a/b; 
     } 

阅读有关test and debug

+0

在帖子的底部有一个关于Qt文档测试和调试的链接,您可以阅读它并找到很好的解决方法。任何方式,如果你想有更多的信息,请让我知道 – saeed

+0

hmmm ....刚刚通过了所有的代码,并用Q_ASSERT_X替换了断言的实例,对话框中显示的错误没有改变,仍然像以前一样无用。 ...“信号接收,劣势因为它从操作系统收到信号而停止。” – SPlatten

+1

如果你正在使用qt creator和gdb goto Tools-> options-> debugger在Gdb中扩展选项卡标记停止当调用qFatal()时 – saeed

1

您可能会定义自己的MY_ASSERT宏。在Linux上,它甚至可以调用另一个函数,它使用Glibc backtrace functions或Ian Taylor的libbacktrace库(假设您的代码使用g++ -g编译为DWARF调试信息),并可能在模态对话框或stderr中显示此类信息。但是,它可能不应该返回。另请阅读有关Qt and Unix signalssignal-safety(7)

但是assert检测到您应该更正的错误。尽量避免使用此类程序员错误运送代码。

在Linux上,通常assert - 它是/usr/include/assert.h中定义的宏 - 将调用失败__assert_fail(在你的C库,但你可能会自己重新定义),这将间接调用abort这间接使得core dump,你可以使用gdb调试器检查验尸。您只需启用核心转储(在您的bash终端中使用内建的ulimit -c)。

+0

Starynkevich听起来不错,发布+1,可以在Linux中有用 – saeed