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輸出,在崩潰日誌裡還無法檢視大概在哪一步操作崩潰的 後來在...