Qt SIGABRT替代消息?

时间:2017-10-19 07:46:47

标签: c++ qt sigabrt

我正在使用Qt5.9,这是一个简单的检查:

      assert(pobjNode != NULL);

将显示“收到Qt信号”错误对话框,该对话框未提供有关问题所在位置或位置的任何有用信息。

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

我正在考虑的是一种设置对话框的方法,以便在发生错误时显示错误。

2 个答案:

答案 0 :(得分:1)

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

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

您还可以qFatal等Qt错误消息功能的输出重定向到您的自定义消息处理程序(使用qInstallMessageHandler())。例如,如果要将错误消息重定向到文件,则可能很有用。

另请注意,使用宏Q_ASSERT禁用QT_NO_DEBUGassert禁用NDEBUG):这可用于在Qt相关之间分隔断言代码和其余部分。

Q_ASSERT_X如果test为false,则打印消息以及源文件名和行号的位置。 如果test为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

答案 1 :(得分:1)

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

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

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