2009-11-02 40 views
7

我有一個程序出現故障:如何在C中調試gdb中的St9bad_alloc失敗?

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

我想這件事情做malloc/free,但我不知道是哪一個。

我可以在gdb中設置哪個斷點,以便在錯誤上斷開以便我可以查看堆棧跟蹤?

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

回答

12

它不是真的malloc/free導致異常,它是「新」,它肯定是在你的應用程序的C++部分。看起來你正在提供一個太大的參數來分配「新」。

int * p = new int[50000000]; 

是什麼回溯說,當你加載崩潰轉儲到GDB:

「的std :: bad_alloc的」是由例如下面的代碼引起的? 如果你不能生成轉儲,你可以要求GDB停止when exception is thrown or caught。 不幸的是,一些版本的GDB只支持以下語法:

catch throw 

這使得當任何異常被拋出,你把應用程序。 然而,在幫助你看到它應該可以在新版本中運行

catch throw std::bad_alloc 

而且不要忘了:

(GDB)有助於抓住

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

+0

「當異常被拋出或被捕獲」的鏈接是404。 – Karl 2013-02-14 08:07:39

0

這很可能是由於某些內存被覆蓋而導致的,從而破壞了內存分配系統的狀態(通常在內存塊返回到應用程序之前或之後)。

如果您有可能(即您在x86 Linux上),請運行您的程序Valgrind,它通常會向您顯示發生損壞的確切位置。

0

我試圖在不存在的文件中讀取時嘗試創建一個文件內容的內部緩衝區,但由於該文件不存在,我創建了緩衝器擰緊。

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

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