Qt SIGABRT替代消息?

Qt SIGABRT alternative message?

我用的是Qt5.9,简单检查一下:

      assert(pobjNode != NULL);

将导致显示“Qt 信号已接收”错误对话框,该对话框不会提供有关问题所在或问题所在的任何有用信息。

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

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

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

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

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

另请注意 Q_ASSERT 被宏 QT_NO_DEBUG 禁用(而 assertNDEBUG 禁用):这可用于在 Qt 之间分隔断言-相关代码及其他。

Q_ASSERT_X 打印消息 what 以及位置 where、源文件名和行号(如果测试为 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 的更多信息。

您可以定义自己的 MY_ASSERT 宏。在 Linux 上,它甚至可以调用另一个使用 Glibc backtrace functions or Ian Taylor's libbacktrace library (provided your code is compiled with DWARF debug information using g++ -g) and perhaps display such information in a modal dialog, or on stderr. However, it should probably not return. Read also about Qt and Unix signals and signal-safety(7).

的函数

但是 assert 检测到您应该更正的错误。尽量避免发布带有此类程序员错误的代码。

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