1. 程式人生 > >GDB 除錯C++異常

GDB 除錯C++異常

除錯C++異常的兩種辦法:
1) 直接獲取異常的相關呼叫函式,在相應函式處設定斷點。
2) 利用gdb的catch throw/catch。(程式執行後,方有效)

如何獲取C++呼叫函式資訊?
寫一個簡單C++程式,讓程式因異常而終止,bt檢視呼叫棧,即可知道異常相關函式。

一個簡單程式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include <iostream> #include <string> // #include <exception> #include <stdexcept> void ter_handler(){ printf("custom handler\n"); } void test(){ throw std::runtime_error("test function"); } int main(int argc, char** argv)
{ std::set_terminate(__gnu_cxx::__verbose_terminate_handler); // std::set_terminate(ter_handler); try{ // throw 5; throw std::runtime_error("test error"); } catch(...){ printf("catch exception\n"); } test(); return 0; }


g++ -o test exception.cc
gdb ./test
Program received signal SIGABRT, Aborted.
0x0000003cf592e2ed in raise () from /lib64/tls/libc.so.6
(gdb) bt
#0 0x0000003cf592e2ed in raise () from /lib64/tls/libc.so.6
#1 0x0000003cf592fa3e in abort () from /lib64/tls/libc.so.6
#2 0x0000003cf86b1138 in __gnu_cxx::__verbose_terminate_handler () from /usr/lib64/libstdc++.so.6
#3 0x0000003cf86af166 in __cxa_call_unexpected () from /usr/lib64/libstdc++.so.6
#4 0x0000003cf86af193 in std::terminate () from /usr/lib64/libstdc++.so.6
#5 0x0000003cf86af293 in __cxa_throw () from /usr/lib64/libstdc++.so.6
#6 0x0000000000400e9f in test ()
#7 0x0000000000400f9d in main ()

從上述呼叫棧,可以得知異常由__cxa_throw ()丟擲,可在該函式處設定斷點,從而得知“異常出自哪裡”。

測試環境:
Linux bclnx64 2.6.9-34.ELsmp #1 SMP
GNU gdb Red Hat Linux (6.3.0.0-1.96rh)
Copyright 2004 Free Software Foundation, Inc.

上述給出的獲取異常呼叫函式資訊的方法,應該和作業系統和偵錯程式無關,其他平臺類似。

1) 直接獲取異常的相關呼叫函式,在相應函式處設定斷點。

利用前一步驟的資訊,直接b __cxa_throw,即可設定有效斷點。

2) 利用gdb的catch throw/catch
該方法也很通用,但有一個需要注意的地方:在程式執行之前,catch throw/catch是無效的,需要在程式執行之後(先在main處設定斷點),使用catch throw才有效。

簡單示例:

相關推薦

GDB 除錯C++異常

除錯C++異常的兩種辦法: 1) 直接獲取異常的相關呼叫函式,在相應函式處設定斷點。 2) 利用gdb的catch throw/catch。(程式執行後,方有效) 如何獲取C++呼叫函式資訊? 寫一個簡單C++程式,讓程式因異常而終止,bt檢視呼叫棧,即可知道異常相關函式。 一個簡單程式

Linux入門級gdb除錯--C/C++語言

Linux上面一般使用gdb來進行程式碼的除錯,除錯我目前知道的方法是:首先將寫好的LinuxC/C++程式碼編譯成可執行檔案,注意編譯的時候生成目標檔案.o的時候必須加上-g引數,-g引數是表示生成的.o檔案是包含有列印資訊的,如果不加的話,無法進行除錯,因為沒有任何列印資訊。下面我將根據一個

Linux下使用gdb除錯C/C++程式

在筆者工作實踐中,使用gdb除錯C++程式和除錯C程式,他們稍有不同,下面是使用總結。 一、編譯選項 -g         生成除錯資訊 -gstabs+   以stabs格式生成除錯資訊,並且包含僅供gdb使用的額外除錯資訊生成除

Ubuntu下GDB除錯C語言程式

轉自:http://zhgeaits.me/other/2013/03/17/gdb-study-notes.html,感謝博主。 1.GDB是什麼 GDB是GNU開源組織釋出的一個UNIX下的程式除錯工具,專門用來除錯C,C++這些程式的了,而且都是命令列模式的。 2.準備工作 平

Linux環境下使用GDB除錯C程式

寫這篇部落格的目的是因為我剛剛用gdb解決了一個c語言中賦錯了值的問題,導致整個程式的執行結果是不正常的,這是我求助於gdb解決了這個問題,之前也用gdb這個神器解決過一些執行時的記憶體問題,比如說c程式中非常常見的segment error。這篇部落格為了對g

gdb除錯c++的STL容器

 我一直都是在Linux下做開發的,但是我對GDB的使用並不多。因為平都是用QtCreator除錯程式的。因為工作的原因,以後可能不能再依賴QtCreator了。於是我好好研究一下~ 之前為什麼沒有深入使用GDB,QtCreator帶來一定的便利是一方面,另一方面是覺得

gdb除錯C++程式時列印變數的值

如果這個值是本地變數,那麼沒有任何的問題。gud-tooltip-mode也能正確顯示。不過如果是類裡的成員,有的時候就麻煩了。據我目前的觀察,有的時候gdb可以正確的找到當前類的繼承關係,可以直接使用this來訪問相關資訊:p *this: 打印出當前類裡所有的成員的值p this->member:

比較齊全的gdb除錯c/c++介紹

檢視執行時資料 ———————在你除錯程式時,當程式被停住時,你可以使用print命令(簡寫命令為p),或是同義命令inspect來檢視當前程式的執行資料。print命令的格式是:        print <expr>     print /<f> <expr&g

使用gdb除錯c++程式

  上篇(使用c++開發跨平臺程式)說到,我不怕造東西,我怕的是造出來的東西,如果出了問題,我卻不知道原因.所以除錯分析是一個重要的手段. C++除錯是一個複雜的活.雖然大部分除錯可以通過IDE在開發期間就解決了.但是必然的,還有很多東西需要在生產環境中還原它.分析它,然後解決它.gdb是一個成熟的

【Linux C/C++】 第07講 gdb除錯工具詳解

     當你需要單步跟蹤除錯的時候,就必然會用到gdb工具,不同於VS方便的除錯方式,gdb的除錯並不是那麼的方便直觀。不要降低熱情,熟練以後你會發現Linux下的程式設計方式非常好用。       一、簡介   &

為DEV C++/CodeBlock配置gdb除錯遇到的問題

 DEV C++和CodeBlock都只是一個IDE,不能編譯除錯,需要自己配置MINGW和gdb除錯 1、MINGW 在這下載mingw-get-setup.exe安裝即可。 https://sourceforge.net/projects/mingw/files/MinGW/ 配置MIN

C 編譯: 使用 gdb 除錯

gdb是the GNU Debugger的簡稱。它是一款UNIX平臺的偵錯程式(debugger),可用於為C, C++, Objective-C, Java, Fortran等程式debug。 在gdb中,你可以通過設定斷點(break point)來控制程式執行的進度,並檢視斷點時的變數和函式呼叫狀況,

使用gdb除錯異常

有時程式中有未捕獲的異常會導致程式異常的行為甚至導致程式的直接退出。 這對伺服器程式來說是不可接受的。 可以使用gdb的catch命令來幫助我們除錯異常。 使用gdb捕獲異常的扔出點(相當於在扔出異常的地方新增斷點): catch throw 使用gdb捕獲執行緒

Bochs + GDB 原始碼級除錯C語言核心

環境: Ubuntu 14.04 64bit Bochs 2.6.6 GDB 7.7 想要原始碼級除錯C核心,需要在編譯Bochs時加上 --enable-gdb-stub 引數 sudo ./configure --enable-all-optimizations --enable-long-phy-

使用GDB除錯Android NDK native(C/C++)程式

$ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb --eval-command="set solib-search-path ./debugging/lib

Editplus搭建C/C++執行環境,包括gdb除錯功能

一:配置gcc/g++環境變數 2.配置環境變數 右鍵“此電腦”,選擇“屬性”-->"高階系統設定"-->"環境變數" XXX的使用者變數-->"新建" 之後一直點確定

Linux系統下除錯 C語言程式(使用gdb

問題描述:Linux 系統下用C語言寫 的指令碼程式,程式執行時出現未知錯誤需要除錯找出問題所在地。(阿里雲Ubuntu系統的伺服器)。 解決方法:使用 gdb工具在終端視窗中除錯 C檔案。 具體方法: (1)安裝 gdb  sudo apt-get install

linux應用程式設計筆記(1)gdb除錯方法及如何找出dbg.c程式中的錯誤

摘要: 介紹了gdb偵錯程式以及其使用流程,總結了常用的幾個gdb除錯命令,最後使用這些方法找出dgb.c檔案中的錯誤。 一、gdb簡介     gdb是gnu釋出的一款功能強大的程式除錯工具,其主

linux下c程式設計之gdb除錯

之前在個人微信公眾號寫了一篇關於linux下c程式設計之gcc編譯的文章,感興趣可關注我的個人微信公眾號,搜尋移動開發與網路安全技術棧加關注,或掃描本文末尾的微信二維碼加關注。 今天接著說下linu

C++筆記(8):C++異常處理

交互 under nbsp divide 析構函數 nat 花括號 ++ fff                     異常處理   C++異常處理機制是一個用來有效地處理運行錯誤的非常強大且靈活的工具,它提供了更多的彈性、安全性和穩固性,克服了傳統方法所帶來的問題.