簡體   English   中英

如何在C中調試gdb中的St9bad_alloc故障?

[英]How can I debug St9bad_alloc failures in gdb in C?

我有一個程序失敗:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc

我想這與malloc / free ,但我不知道哪一個。

我可以在gdb中設置什么斷點來破壞錯誤,以便我可以查看堆棧跟蹤?

該程序是C和C ++的組合,使用gcc 3.4.2編譯。

它不是真正的malloc / free導致異常,它是“new”,它絕對是你應用程序的C ++部分。 看起來您提供的參數太大而無法分配“新”。

'std :: bad_alloc'是由以下代碼引起的,例如:

 int * p = new int[50000000];

將崩潰轉儲加載到gdb時,backtrace會說什么? 如果無法生成轉儲,則可以在拋出或捕獲異常時讓GDB停止。 不幸的是,某些版本的GDB僅支持以下語法:

catch throw

它允許您在拋出任何異常時中斷應用程序。 但是,在幫助中,您會看到它應該可以運行

catch throw std::bad_alloc

在較新的版本中。

不要忘記:

(gdb)幫忙抓住

是其他有用信息的良好來源。

很可能由於某些內存被覆蓋而發生這種情況,從而破壞了內存分配系統的狀態(通常在內存塊返回應用程序之前或之后保留)。

如果您有可能(即,您使用的是x86 Linux),請在Valgrind中運行您的程序,它通常可以准確顯示損壞發生的位置。

我嘗試讀取一個不存在的文件時已經有了這個...我會嘗試為文件內容創建一個內部緩沖區,但由於該文件不存在,我的緩沖區創建搞砸了。

int lenth_bytes;
length_bytes = in_file.tellg();
new char [length_bytes]; // length_bytes hadn't been initialised!!!!

記住孩子,總是初始化你的變量:D並檢查零個案例。

暫無
暫無

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

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