Linux gcc和gdb程序調試用法
gcc一般調試格式: www.2cto.com
gcc -Wall -o test test.c // -wall 顯示程序錯誤詳細信息
gcc -v // 顯示gcc的版本
gcc -o{1,2,3} test test.c // 1,2,3三個級別的優化,優化級別越高編譯的時間越長
gcc -ggdb3 -Wall -o test test.c // 運用gdb可以跟蹤調試程序,運行這命令gdb告訴gcc,使用gdb擴展產生調試,其中3表示使用的第三級調試信息,程序員可以獲得更多的信息。
如果程序有多個模塊構成可以分別編譯,然後再整體生成一個可執行的文件
gcc -o test1.c //產生test1.o
gcc -o test2.c //生成test2.o
gcc -o test3.c //生成test3.o
gcc -o program test1.c test2.o test3.o //生成program 最終可執行文件
關於gcc先這麼多,以後用到,再補充。
www.2cto.com
gdb 符號調試器
gdb主要提供以下功能:
1. 監視程序中變量的值得變化
2. 設置斷點,使程序在指定的代碼行上暫停執行,便於觀察
3. 單步執行代碼
4. 分析崩潰程序產生core文件
是首先 gcc -ggdb3 -Wall -o test test.c 調試程序
./test 就是正常的執行程序
如果出現了不正確的結果,再用gdb調試
gdb test
出現(gdb)接口提示符
run //開始運行程序,設置斷點在開始運行之前,其他的命令都在運行程序下執行
step | s //單步執行,遇見函數就進入函數
next | n //單步執行,但不進入函數
quit | q //退出gdb
break LineNumber| functionName
continue | cont N // 表示跳過的斷點數
tbreak LineNumber| functionName // 這只一個臨時的斷電,執行一次就自動刪除
enable / disable 斷點編號 // 回復失效的斷點| 使有效的斷點失效(如果操作多個斷點,中間用空格分開)
clear 斷點的行號
delete 斷點的編號 clear/delete 都是清楚斷點的,變量不一樣啊
watch 邏輯表達式 // 此命令在程序run中運用,必須把main函數設置為斷點,然後continue,程序停止在滿足邏輯表達式地方。
查看棧的信息
bt number //如果number>0 表示顯示棧頂上number數棧的信息
//若果number<0 表示顯示棧底上number數棧的信息
//省略則顯示棧的全部信息
frame | f n // 顯示第n層棧的信息 棧頂是0,一次類推
up <n> // 棧向上移n層 省略默認一層
down <n> // 棧向下移nceng 省略默認一層
select-frame <n> == frame //只是不輸出棧的信息
up-silently <n> == up //只是不輸出棧的信息
down-silently <n> == down //只是不輸出棧的信息
info args //顯示當前函數參數名及值
info locals //顯示函數中所有局部變量
info catch //顯示當先函數的異常處理信息
顯示源代碼
list <function> //顯示function函數的源程序
list // 顯示當前行前後各顯示listsize/2 行代碼
list - // 顯示當前行 前面的代碼
list + // 顯示當前行 後面的代碼
set listsize <number> // 設置一次顯示源代碼的行數
show listsize //查看listsize的數值
list <first>,<last> //顯示全部的源代碼
list ,<last> // 顯示從當前行到last的源代碼
list <linenum> // 顯示linenum行前後各顯示listsize/2 行代碼
list <+ ffset> // 顯示當前行的正偏移量
list <- ffset> //顯示當前行的負偏移量
搜索源代碼
forward-search <regexp> = search <regexp> // 向下搜索
reverse-search <regexp> // 向上搜索
directory <dirname:...> // 增加自定義文件搜索路徑,多個路徑用:隔開
directory // 清除所有自定義源文件搜索路徑信息
show directories //顯示自定義源文件的搜索路徑
源代碼的內存
info line 查看源代碼在內存中的地址。info line 後面可以跟“行號”、“函數名”、“文件名:行號”、“文件名:函數名”
disassemble <> // 後面的參數加的和上面的一樣,顯示匯編代碼
查看運行時的數據
print variable
print file::variable | function::variable // 如果查看的是全局變量的,為了防止和局部變量重名,可以加上通過這個形式說明
print *array@len //顯示動態數組
print *array // 顯示靜態數組
print /<f> <expr> // 格式輸出數據
輸出格式如下:
x 十六進制顯示
d 十進制顯示
u 十六進制顯示無符號整數
o 八進制顯示
t 二進制顯示
a 十六進制顯示
c 字符格式顯示
f 浮點數格式顯示
查看內存
x/<n/f/u> <addr> // 其中n表示顯示的第三個參數的個數,f格式見上面,u從當前地址往後請求的字節數,默認為4,b代表單字節,h代表雙字節,w代表4字節,g表示8字節
自動顯示
display <expr> //只要變量有效的范圍內都會顯示
undisplay | delete display <dnums...> // 刪除編號為dnums的自動顯示,同時刪除好幾個用空格隔開
disable display <dnums...> // 使編號為dnums的自動顯示失效,多個的也是空格隔開
enable display <dnums...> //使編號為dnum的自動顯示回復,多個也是用空格隔開
info display // 顯示全部自動顯示的信息
設置顯示選項
set print address on //gdb一般會顯示參數的地址信息 ,默認認為打開
set print address off //gdb一般不顯示參數的地址信息
show print address //查看是否未打開
set print array on // 打開數組的每個元素占一行
set print array off // 關閉數組的每個元素以逗號隔開
show print array //查看是否打開
set print element <number-of-elements> // 顯示數組最大的長度
show print element
set print null-stop <on/off> // 是否遇到結束符停止顯示,默認是關閉的
set print pretyy on // 結構體顯示比較漂亮
show print pretyy // 查看如何顯示結構體
set print sevenbit-strings // 字符顯示是否打開
set print union <on/off> //是指顯示結構體時候是否顯示其內的聯合體數據
show print union
set print object <on/off> //在c++,當一個對象指向派生類,打開這個選項,gdb會自動按虛方法調用的規則顯示
set print static-members <on/off> // C++對象中,是否顯示其中靜態數據成員,默認on
show print static-members
set print vtbl <on/off> // gdb會比較規整格式顯示虛函數,默認關閉
show pritn vtbl
查看寄存器
info registers // 查看寄存器的情況(除了浮點寄存器)
info all-registers //查看所有寄存器的情況(包括浮點寄存器)
info registers <regname...> //查看制定寄存器的情況
gdb環境變量
//你可以環境調試中定義自己的變量,用來保存調試程序中的運行數據。
set $var = expr
show convenience // 查看當前設置的所有環境變量
ex > set $i=0
print bar[$i++] -> contents // 輸入這樣的命令後,只需按Enter,重復上一條語句,環境變量會自動累加
修改變量值
print s = expr | set var s = expr // 最好使用後者
跳轉執行
jump <linenumber> //跳轉到linenumber行
jump <address> // 跳轉到地址為address處
jump <+offse> // 向下跳offse行
//使用jump命令最好在當前的函數的跳轉,跨越函數跳轉會發生錯誤
signal <singal> // 信號量在1到15
return
return <expr>
//強制返回,返回可以帶返回值
call <func> // 強制調用函數
不同的語言使用gdb
show language // 查看當前的語言環境
info frame // 查看當前函數的程序語言
info source // 查看當前文件的程序語言
set language +語言名字 // 手動設置語言 // c/c++/asm/fortran/java/modula-2/pascal/scheme
core dump 分析
ulimit -c unlimited // 是自己擁有使用core dump 的權限
gdb test core+xxx // 系統防止本次生成core覆蓋上次的,所有core後面加上pid號加以區分