如何获取有关该错误的更多信息
How do I get more information about that error?
Qt应用程序崩溃,甚至调试器模式也是我得到的:
ASSERT: "!isEmpty((" in file C:\Qt\Qt5.5.0\5.5\mingw492_32\include\QtCore/qlist.h, 第 321 行
文件中的该行指向:
inline void removeLast() { Q_ASSERT(!isEmpty()); erase(--end()); }
但我想要更多信息。就像源代码中的哪一行正在使用它一样(从搜索,没有直接调用removeLast()
完成(。这可能吗?
如果在调试器中运行程序,它将在断言时停止,您将能够检查堆栈跟踪。例如,在 GDB 中使用此程序:
#include <QList>
int main(int argc,char* argv[])
{
QList<int> my_list;
my_list.append(1);
my_list.pop_back(); // 1
my_list.pop_back(); // 2
return 0;
}
当你运行它时:
(gdb) r
Starting program: /home/leiaz/tmp/qttest/build/proj
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
ASSERT: "!isEmpty()" in file /usr/include/qt/QtCore/qlist.h, line 321
Program received signal SIGABRT, Aborted.
0x00007ffff61275f8 in raise () from /usr/lib/libc.so.6
断言停止调试器,您可以请求堆栈跟踪:
(gdb) backtrace
#0 0x00007ffff61275f8 in raise () from /usr/lib/libc.so.6
#1 0x00007ffff6128a7a in abort () from /usr/lib/libc.so.6
#2 0x00007ffff6dc11e1 in QMessageLogger::fatal(char const*, ...) const () from /usr/lib/libQt5Core.so.5
#3 0x00007ffff6dbc34e in qt_assert(char const*, char const*, int) () from /usr/lib/libQt5Core.so.5
#4 0x00000000004060aa in QList<int>::removeLast (this=0x7fffffffe4d0)
at /usr/include/qt/QtCore/qlist.h:321
#5 0x0000000000405de0 in QList<int>::pop_back (this=0x7fffffffe4d0)
at /usr/include/qt/QtCore/qlist.h:337
#6 0x0000000000405ad4 in main (argc=1, argv=0x7fffffffe5d8) at /home/leiaz/tmp/qttest/main.cc:9
你可以看到pop_back
调用removeLast
,我的代码从第 6 帧开始:
(gdb) frame 6
#6 0x0000000000405ad4 in main (argc=1, argv=0x7fffffffe5d8) at /home/leiaz/tmp/qttest/main.cc:9
9 my_list.pop_back(); // 2
在这里,您可以检查该帧中其他变量的值。
如果您使用的是Qt Creator,请参阅查看调用堆栈跟踪。
就像源代码中的哪一行正在使用它一样(从搜索中,没有直接调用 removeLast(( 完成(。这可能吗?
不幸的是,assert()
或Q_ASSERT()
宏只是表明条件是错误的,而不是导致这些条件的代码。
特别是如果多次调用和/或从许多地方调用,断言对于检测实际导致它的代码不是很有帮助。
可以为isEmpty()
条件设置条件断点(如果调试器很好地支持(。
如果您有权访问调试符号,还可以在标准abort()
函数中设置断点。
如果没有,并且如果您对源代码具有完全访问权限(对于标头中内联的函数(,则可以解决该缺陷。我通常的做法是暂时将此类代码更改为
void removeLast()
{
if(isEmpty()) { // <<<<<<<<<<< Put an encapsulating if clause here
return; // <<<<<<<<<<<< set breakpoint
}
Q_ASSERT(!isEmpty()); erase(--end());
}
并设置调试器断点。从调试器运行代码时命中断点时,我将检查调用堆栈以查看其来源。
相关文章:
- 提升异常的错误信息
- 我可以复制构造一个带有错误信息的提升::异常吗?
- androidndk和eclipse给出了关于c++getline()函数的不同错误信息
- 如何从lex / yacc获取更多解析错误信息
- Lua+Luabind,"runtime error"后堆栈顶部没有错误信息
- 如何使用Boost获取SyntaxError、NameError等的Python错误信息
- 用户输入数字的错误信息/向量
- 如何在MSBuild中定制c++编译器错误信息
- 程序崩溃,没有错误信息
- 在正确嵌套错误信息时遇到麻烦
- 错误信息c++
- 改进了dll丢失错误信息
- 关于隐式删除虚析构函数的错误信息是什么?
- 如何在c++中解释以下错误信息
- 如何解释显示在控制台上的c++错误信息
- 在我用c++编写的程序中显示错误信息
- visual studio中错误信息后面的消息是什么意思?
- c++汽车仪表模拟器.我一直收到这些错误信息
- Xcode 3.2断点错误信息
- 分割错误(core dumps) c++代码编译时的错误信息