2011-11-20 37 views
3

我使用g ++一個簡單的測試程序編譯:計劃在gdb下凍結時發生異常

int main() 
{ 
    try 
    { 
    printf("before\n"); 
    throw 1; 
    } 
    catch(int i) 
    { 
    printf("catched int\n"); 
    } 
    catch(...) 
    { 
    printf("catched(...)\n"); 
    } 
} 

通常工作正常使用或不調試信息包括在內。 但是當用gdb調試時,它總是掛在「throw 1;」上所以我無法調試程序,通常會拋出異常。 從調試器的最後一個信息是:

Catchpoint 1 (exception thrown), 0x00007ffff7b8f9e0 in __cxa_throw() from /usr/lib/libstdc++.so.6 

我的編譯和鏈接選項:

g++ -Wshadow -Wunreachable-code -Wswitch-enum -Wswitch-default -Wextra -Wall -pg -g -m64 -c main.cpp 

g++ -o exec/exception_problem obj/main.o -pg 

我的環境: 的Ubuntu 10.10,64位; g ++/gcc 4.4.5; gdb 7.2; 在codeblocks下調試svn rev 7440

任何想法是什麼問題?

附加信息: GDB日誌的最後兩行分別是:

Catchpoint 1 (exception thrown), 0x00007ffff7b8f9e0 in __cxa_throw() from /usr/lib/libstdc++.so.6 
>>>>>>cb_gdb: 

在日誌中的最後一個字符是冒號。 gdb的命令行:

/usr/bin/gdb -nx -fullname -quiet -args exec/exception_problem 

我沒有發現我的家目錄中的所有* gdbinit *;全球gdbinit是空的。代碼塊是否可能準備特定的gdbinit並將其放到gdb中?

最好的問候。

+0

它是如何「掛」到的?你有(gdb)提示嗎?如果按Ctrl + C或Ctrl + Z,會發生什麼情況? – themel

+0

Ctrl + C關閉程序和終端窗口,但condeblocks中的調試會話仍處於活動狀態(調試日誌中沒有新的信息)。之後,我可以通過停止按鈕正常結束會話。 – ardabro

回答

1

Catchpoint 1 (exception thrown) ...

有什麼在你.gdbinit,你還沒有告訴我們什麼? (也許catch throw?)

是否Catchpoint 1真的 GDB打印的最後一行?這裏是我看到的:

Reading symbols from /tmp/a.out...done. 
Catchpoint 1 (throw) 
(gdb) run 
before 
Catchpoint 1 (exception thrown), __cxxabiv1::__cxa_throw (obj=0x602090, tinfo=0x601060, dest=0) at ../../../../src/libstdc++-v3/libsupc++/eh_throw.cc:70 
70 ../../../../src/libstdc++-v3/libsupc++/eh_throw.cc: No such file or directory. 
    in ../../../../src/libstdc++-v3/libsupc++/eh_throw.cc 
(gdb) c 
catched int 
[Inferior 1 (process 16008) exited normally] 
(gdb) q 
+0

實際上最後兩行是: Catchpoint 1(異常拋出),0x00007ffff7b8f9e0來自/usr/lib/libstdc++.so.6的__cxa_throw() >>>>>> cb_gdb: log中的最後一個字符是冒號。 gdb命令行: /usr/bin/gdb -nx -fullname -quiet -args exec/exception_problem 我在主目錄中沒有找到任何* gdbinit *全球gdbinit是空的。 代碼塊是否可能準備特定的gdbinit並將其放到gdb中? – ardabro