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 檢視斷...