我使用Qt5.9,一个简单的检查:Qt SIGABRT替代消息?
assert(pobjNode != NULL);
将导致显示Qt的信号接收错误对话框,它没有给出任何关于问题出在哪里或什么是任何有用的信息。
有没有办法用一些更有用的东西来替代这些无用的信息?
我在想的是一种设置对话框的方法,以显示出现错误时可能出现的错误。
我使用Qt5.9,一个简单的检查:Qt SIGABRT替代消息?
assert(pobjNode != NULL);
将导致显示Qt的信号接收错误对话框,它没有给出任何关于问题出在哪里或什么是任何有用的信息。
有没有办法用一些更有用的东西来替代这些无用的信息?
我在想的是一种设置对话框的方法,以显示出现错误时可能出现的错误。
Q_ASSERT
是一个自定义断言宏,它可以增强标准的assert
函数。
该错误消息由qFatal()
处理,它在某些平台上的行为可能会比标准断言宏好一些。例如,在Windows上,它将在断言失败的位置触发Visual Studio调试器,而不是仅调用abort()
。
您还可以重定向 Qt错误消息的输出功能,如qFatal
到您的自定义消息处理程序(与qInstallMessageHandler())。例如,如果您想将错误消息重定向到一个文件,它会很有用。
还要注意的是Q_ASSERT
是禁用宏QT_NO_DEBUG
(而assert
由NDEBUG
禁用):这可以用来分隔您的断言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。
您可能会定义自己的MY_ASSERT
宏。在Linux上,它甚至可以调用另一个函数,它使用Glibc backtrace functions或Ian Taylor的libbacktrace库(假设您的代码使用g++ -g
编译为DWARF调试信息),并可能在模态对话框或stderr中显示此类信息。但是,它可能不应该返回。另请阅读有关Qt and Unix signals和signal-safety(7)。
但是assert
检测到您应该更正的错误。尽量避免使用此类程序员错误运送代码。
在Linux上,通常assert
- 它是/usr/include/assert.h
中定义的宏 - 将调用失败__assert_fail
(在你的C库,但你可能会自己重新定义),这将间接调用abort
这间接使得core dump,你可以使用gdb
调试器检查验尸。您只需启用核心转储(在您的bash终端中使用内建的ulimit -c
)。
Starynkevich听起来不错,发布+1,可以在Linux中有用 – saeed
在哪个操作系统上?为什么使用'gdb'调试器是不够的? –
Ubuntu,我不想使用调试器来处理所有事情......它更容易抛出断言并运行应用程序。 – SPlatten