一个Qt应用程序崩溃了,甚至在调试器模式下,我所得到的就是:



文件中的该行指向:

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

您可以看到removeLast调用了pop_back,我的代码从第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,请参阅Viewing Call Stack Trace

09-08 00:38