GDB常用除錯命令(一)

2022-06-30 03:42:11 字數 3127 閱讀 3164

gdb是unix及unix-like下的除錯工具,通常gdb使用前置條件:編譯時加入debug資訊,這裡指的是c++。

gcc/g++除錯選項

gcc/g++是在編譯時加入-g,-g分4個等級:

-g0等於不加-g;即不包含任何資訊

-g1只包含最小資訊,一般來說只有你不需要debug,只需要backtrace資訊,並且真的很在意程式大小,或者有其他保密/特殊需求時才會使用-g1

–g2為gdb預設等級,包含絕大多數你需要的資訊

–g3包含一些額外資訊,例如包含巨集定義資訊

關於gcc/g++優化級別,總結如下:

gcc/g++ -o選項,gcc編譯c,g++編譯c++,-o分4個等級:

-o0編譯不優化,如果指定了多個-o選項,不管帶不帶數字,最後乙個選項才是生效的選項

-o1是最基本的優化等級。編譯器會在不花費太多編譯時間的同時試圖生成更快更小的**。這些優化是非常基礎的,但一般這些任務肯定能順利完成

-o2是推薦的優化等級,除非你有特殊的需求。-o2會比-o1啟用多一些標記。設定了-o2後,編譯器會試圖提高**效能而不會增大體積和大量占用的編譯時間

-o3是最高最危險的優化等級。用這個選項會延長編譯**的時間,並且在使用gcc4.x的系統裡不應全域性啟用。自從3.x版本以來gcc的行為已經有了極大地改變。在3.x,-o3生成的**也只是比-o2快一點點而已,而gcc4.x中還未必更快。用-o3來編譯所有的軟體包將產生更大體積更耗記憶體的二進位制檔案,大大增加編譯失敗的機會或不可預知的程式行為(包括錯誤)。這樣做將得不償失,記住過猶不及。在gcc 4.x.中使用-o3是不推薦的

-os這個等級用來優化**尺寸。其中啟用了-o2中不會增加磁碟空間占用的**生成選項。這對於磁碟空間極其緊張或者cpu快取較小的機器非常有用。但也可能產生些許問題,因此軟體樹中的大部分ebuild都過濾掉這個等級的優化。使用-os是不推薦的

gdb常用操作

1.gdb 程式名,進入gdb後,使用run/r命令執行gdb除錯,如果程式需要傳遞引數,run後面加[arg];

2.如果程式需要傳遞引數,gdb --args 程式名 [arg],進入gdb後,使用run/r;

3. 進入gdb後,輸入程式名;如果需要給程式傳遞引數,使用set args  ["input"] 設定程式引數,再執行run/r,啟動程式;

gdb attach [pid]

list:list(l)  [函式名][行數],檢視原始碼,簡寫l

break/b line_number:

在line_number行上打斷點,使程式在line_number行執行前停止

break/b [filename]function_name:

在filename檔案下的function_name函式入口停止

break/b [filename]line_number:

在filename檔案下的line_number行打斷點

break/b +offset/-offset :

在當前行號的前面或後面offset停止

break/b  where if condition :

當某個條件滿足時,在某一行停止; eg:在迴圈體中可以設定break ... if i = 100 來設定迴圈次數

break/b :

沒有引數在下一行停止

在程式的執行位址處停止

info break:

顯示當前的斷點資訊

delete/d breakpoint_id:

關閉斷點

disable/enable breakpoint_id:

禁用/使能斷點,該命令將禁止、允許斷點 1,同時斷點資訊的 (enb)域將變為 n、y

run/r  [args] :run命令可以直接接命令列引數值

set args ["input"]: 修改傳送給程式的引數(進入gdb後才能使用)

show args:檢視其預設引數的列表(進入gdb後才能使用)

next/n:不進入的單步執行

step/s:進入的額單步執行

finish:執行程式,直到當前函式完成返回,並列印函式返回時的堆疊位址和返回值以及引數資訊

until退出當前的迴圈體

1.檢視資料

print  variable : 檢視變數

print  *array@len :檢視陣列(array是陣列指標,len是需要資料長度)

可以通過新增引數來設定輸出格式:

/x 按十六進製制格式顯示變數

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

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

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

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

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

/c 按字元格式顯示變數

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

2.檢視記憶體

examine /n f u + 記憶體位址(指標變數)

n 表示顯示記憶體長度

f 表示輸出格式(見上)

u 表示位元組數制定(b 單位元組;h 雙位元組;w 四位元組;g 八字節;預設為四位元組)

如:x /10cw pfilepath  (pfilepath為乙個字串指標,指標佔4位元組)

x 為examine命令的簡寫。

3.檢視棧資訊

backtrace [-n][n],簡寫bt

n  表示只列印棧頂上n層的棧資訊

-n 表示只列印棧底上n層的棧資訊

不加引數,表示列印所有棧資訊

reverse-search text:該命令可以顯示包含text 的前一行

call function:強制呼叫某函式,它會顯示函式返回值(如果函式返回值不是void型別)

gdb attach pid:除錯已執行的程序,pid為程序號

clear:刪除剛才停止處的斷點

GDB常用除錯命令

呼叫gdb編譯需要在cc後面加 g引數再加 o root redhat home gdb 除錯檔案 啟動gdb gdb l 字母l 從第一行開始列出原始碼 gdb break n 在第n行處設定斷點 gdb break func 在函式func 的入口處設定斷點 gdb info break 檢視斷...

gdb常用除錯命令

將.c檔案程式設計成包含標準除錯資訊的檔案 命令 gcc g c o 1 啟動gdb除錯程式 兩種方式 a gdb filename b 啟動gdb後,使用file filename 2 list l 檢視程式 方便設定斷點 3 break b 函式名 在某函式入口處新增斷點 4 break 行號 ...

GDB 常用除錯命令

呼叫gdb編譯需要在cc後面加 g引數再加 o root redhat home gdb 除錯檔案 啟動gdb gdb l 字母l 從第一行開始列出原始碼 gdb break n 在第n行處設定斷點 gdb break func 在函式func 的入口處設定斷點 gdb info break 檢視斷...