標籤:
【程式】
[編譯成未連結的目標程式/.o檔案]
[沒有符號表被讀取。請使用 "file" 命令]
First, did you correctly compile the c program? Like:
gcc -g your.c -o aaa
Once you finish compiling the program, use below command to gdb it:
gdb aaa
Or if you start gdb w/o specifying the program `aaa‘, you can input
`file aaa‘
in the gdb shell.
[執行程式]
run:重新執行
[查看變數/需要斷點]
print/p +變數名
若把斷點設定在迴圈體內部想要迴圈輸出變數值,則需要next命令執行下一條語句。
[按格式輸出變數]
p i:正常輸出;p/c i:字元格式設定;p/t i:二進位格式
[調用函數/需要斷點]
break 19
run
print func(3) //函數中的形參必須換成實參
[查看數組/需要斷點]
break 12
run
print sz
[自動顯示變數/需要斷點]
break 15
run
display/d i //格式化自動輸出i
display/d result //格式化輸出result
step/next //執行下一步並顯示當前display中自動輸出變數(i和result)的值
info display //查看當前display中的自動顯示變數的編號+格式+變數名
[刪除自動顯示變數]
delete display 1 //根據info得到的編號刪除某個自動顯示變數
undisplay //刪除當前display中所有的變數
[啟用/禁用自動提示]
disable display [1] //display後加行號表示禁用當前行,不加表示禁用所有行
enable display [1] //啟用,作用同上
disable display 1 2 //中間空格可以操作多個自動顯示變數
【斷點】
註:<1>斷點之後的命令不會自動執行(無論是main還是其他函數中),只能手動一步步走;
<2>斷點會跟著調用函數從而進入外部函數體內。
[建立斷點]
break 1
[刪除端點]
<1>(gdb)delete breakpoint 1 //刪除當前位置斷點,1代表第一個斷點
<2>clear //刪除程式上次停止處的斷點
<3>clear 20 //刪除第20行的所有斷點
[設定斷點有效無效]
enable/disable breakpoint
[查看當前斷點資訊]
info break/b
[斷點處變數數值]
print/p +變數名
若把斷點設定在迴圈體內部想要迴圈輸出變數值,則需要next命令執行下一條語句。
[快速鍵進入下一個斷點]
註:<1>[斷點之後]可以使用run、continue、next、step繼續執行。
<2>斷點停下來後如果被繼續執行了一次,那麼接下來的程式執行可以使用Enter代替剛才的命令。
#.run continue next step的區別
[run]:頭部=>斷點
是指把gcc -c編譯好的中間程式從頭執行,保留斷點/自動顯示等屬性;
[continue]:斷點=>結束/迴圈一次
如果斷點不在迴圈內部,那麼執行一次就直接輸出結果;如果斷點在迴圈裡面,那麼執行一次就等於進行了一次迴圈(方便~);
[step]:斷點=>斷點+1命令列(進入被調函數)
如果命令將要啟動並執行原始碼行上有函數調用,那麼step命令將導致GDB進入到被調用函數的內部。
[next]:斷點=>斷點+1命令列(不進入被調函數)
則和step不同,它不會進入函數,而是在出口坐等。
//以上四種都可以在斷點後設定自動顯示變數,特別是在迴圈內部用於監控數值變化。
[條件斷點]:符合條件時斷點才會出現,用於迴圈/判斷中
<1>break 6 //假設info break是2號
condition 2 i==5 //當i=2時在第6行加上斷點,其他情況等於這個斷點不存在
<2>break 6 if i==5 //含義同上,只不過合起來寫了
Linux日記-gdb命令