簡體   English   中英

我如何獲得有關該錯誤的更多信息?

[英]How do I get more information about that error?

一個Qt應用程序崩潰了,甚至在調試器模式下,我都得到了:

ASSERT:文件C:\\ Qt \\ Qt5.5.0 \\ 5.5 \\ mingw492_32 \\ include \\ QtCore / qlist.h,第321行中的“!isEmpty()”

文件中的該行指向:

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

您可以看到removeLastpop_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,請參閱查看呼叫堆棧跟蹤

就像源代碼中確切使用的行一樣(從搜索開始,沒有直接調用removeLast()完成)。 這可能嗎?

不幸的是assert()Q_ASSERT()宏只是表明條件是錯誤的,而不是哪個代碼導致了這些條件。

尤其是如果多次調用和/或從很多地方調用,斷言對於檢測實際導致它的代碼不是很有幫助。


如果調試器很好地支持,則可以為isEmpty()條件設置條件斷點。

如果可以訪問調試符號,則還可以在標准abort()函數中設置斷點。


如果沒有,並且您可以完全訪問源代碼(對於標頭中內聯的函數具有全部訪問權限),則可以解決該缺陷。 我通常的做法是暫時將此類代碼更改為

void removeLast() 
{ 
   if(isEmpty()) { // <<<<<<<<<<< Put an encapsulating if clause here
       return;  // <<<<<<<<<<<< set breakpoint     
   }
   Q_ASSERT(!isEmpty()); erase(--end());
}

並設置調試器斷點。 當在調試器中運行代碼時遇到斷點時,我將檢查調用堆棧以查看中斷源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM