列印所有堆疊資訊 gdb GDB除錯C 類

2021-10-14 16:19:25 字數 2791 閱讀 8307

linux上除錯常用的工具就是gdb了。借助學習c++虛函式表和記憶體布局的機會順便學習下gdb常規除錯技巧。

一,測試用例

1,c++標頭檔案(szyu_test_gdb.h)

#ifndef __szyu_gdb__

#define __szyu_gdb__

#include class base

; base( int v ) : non_static_member1( v ) ;

virtual ~base() ;

public:

void

non_static_func1()

static void

static_func1()

virtual void

virtual_func1()

private:

int non_static_member1;

static int static_member1;

};int base::static_member1 = 99;

#endif

2,c++測試用例(szyu_test_gdb.cpp)

#include "szyu_test_gdb.h"

void

test1()

intmain( int argc, char *ar** )

二,除錯

1,gdb除錯前需編譯生成可執行檔案,並且需把除錯資訊加到可執行檔案中。-g引數可以做到這點。使用方法為:g++ -g szyu_test_gdb.cpp(預設生成a.out可執行檔案)

2,啟動gdb除錯:gdb a.out

,設定斷點,可獲取執行時的堆疊資訊。

分別對以下位置設定了斷點:

1)建構函式:base( int v )

2)虛析構函式:virtual ~base()

3)靜態函式呼叫:bb.static_func1()

4)非靜態函式呼叫:bb.non_static_func1()

5)虛函式呼叫:bb.virtual_func1()

5,c(continue)恢復程式執行,接下來程式停在第二斷點處,即base(int v)建構函式處。列印base類物件bb如下:

由於虛函式表是二級指標。所以使用void **轉換。再使用解引用運算子變成一級指標。

其中還涉及到set print array,@和/a三個知識點:

預設陣列顯示是關閉狀態的(即列印陣列時,每個元素則以逗號分隔)。開啟陣列顯示狀態後,每個元素佔一行列印。

p /a 列印語句中a只是引數選項之一,常見該引數如下: x 按十六進製制格式顯示變數。

d 按十進位制格式顯示變數。

u 按十六進製制格式顯示無符號整型。

o 按八進位制格式顯示變數。

t 按二進位制格式顯示變數。

a 按十六進製制格式顯示變數。

c 按字元格式顯示變數。

f 按浮點數格式顯示變數。

「@」的左邊是第乙個記憶體的位址的值,「@」的右邊則你你想檢視記憶體的長度。上圖中的4代表列印出四段記憶體長度。此處由於虛函式表中總共存了三個虛函式記憶體段位址,故最後乙個值是隨機數。

為了支援rtti(run time type identification,執行時型別識別),在虛函式表前存放了type_info指標。

而靜態成員變數和非靜態成員變數獲取如下:

6,c(continue)繼續執行,接下來程式停留在第三個斷點處,即非靜態方法呼叫。

7,c(continue)繼續執行,接下來程式停留在第四個斷點處,即虛函式呼叫。

8,c(continue)繼續執行,接下來程式停留在第五個斷點處,即虛析構函式。

通過info line檢視位址與虛函式表一致。

以上可能存在有不足的地方歡迎指出討論,覺得不錯的朋友希望能得到您的**支援,同時可以持續關注我。

(更多免費 c/c++,linux,nginx,zeromq,mysql,redis,fastdfs,mongodb,zk,流**,cdn,p2p,k8s,docker,tcp/ip,協程,dpdk等等多個知識點乾貨學習資料** 960994558)

列印所有堆疊資訊 gdb 用gdb除錯caffe

1 用gdb除錯的好處 gdb是除錯c 很有用的工具。在caffe上也是如此。用gdb除錯caffe對於初學者來說可以更好的了解caffe的整個內部微觀機制。並且是更有效理解caffe原始碼的好辦法。2 準備工作 只有將caffe原始碼以debug模式進行編譯才能夠進行除錯,否則編譯器會進行優化忽略...

Log4j 列印堆疊資訊

我的理解當然很簡單,e.printstacktrace 是在控制台輸出來的,logger4j是在日誌中輸出來的。後來同事打了個啞謎還有乙個是關係到buffer上的區別,對於這點其實我還是沒有怎麼搞明白,有知道的小夥伴可以來解答下。2.logger.error exception 和logger.er...

Lua呼叫C 時列印堆疊資訊

公司的手遊專案,使用的是基於cocos2d x綁lua的解決方案 引數quick x的繫結 雖然使用了lua進行開發,更新很爽了,但是崩潰依然較為嚴重,從後台檢視崩潰日誌時,基本上只能靠 猜 來復現bug。更為鬱悶的是很多時候並沒有使用log輸出,在崩潰日誌裡還無法檢視大概在哪一步操作崩潰的 後來在...