我正在使用Qt5.9,这是一个简单的检查:
assert(pobjNode != NULL);
将显示“收到Qt信号”错误对话框,该对话框未提供有关问题所在位置或位置的任何有用信息。
有没有办法用更有用的东西替换这些无用的信息?
我正在考虑的是一种设置对话框的方法,以便在发生错误时显示错误。
答案 0 :(得分:1)
Q_ASSERT
是一个自定义断言宏,据称可以增强标准assert
函数。
错误消息由 qFatal()
处理,在某些平台上的行为可能比标准的断言宏稍微好一些。例如,在Windows上,它将在断言失败的位置触发Visual Studio调试器,而不是仅调用abort()
。
您还可以将qFatal
等Qt错误消息功能的输出重定向到您的自定义消息处理程序(使用qInstallMessageHandler())。例如,如果要将错误消息重定向到文件,则可能很有用。
另请注意,使用宏Q_ASSERT
禁用QT_NO_DEBUG
(assert
禁用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 signals和signal-safety(7)。
但assert
检测到您应该纠正的错误。尽量避免使用此类程序员错误运送代码。
在Linux上,通常的assert
-it是/usr/include/assert.h
中定义的宏 - 将调用失败__assert_fail
(在您的C库中,但您可能会自己重新定义)间接调用abort
,间接生成core dump,您可以使用gdb
调试器检查事后检查。您只需启用核心转储(在bash终端中使用内置ulimit -c
)。