如果你在調試器中運行你的程序,它將停止斷言,你將能夠檢查堆棧跟蹤。例如用此程序在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。
任何人都可以在沒有看到您的代碼的情況下回答問題? –
你是通過代碼來找出發生的地方嗎? – NathanOliver
@RSahu:這是來自一個很大的代碼庫,我甚至不知道錯誤來自哪裏,這就是爲什麼我問我如何知道更多。 – Jack