計算機系統討論課(2) gdb調試常用指令

預先準備 

  • 編譯:gcc –g file.c –o file  (-g: 在生成可執行文件時加入源碼信息,使得生成的可執行文件能夠進行調試)
  • 進入gdb調試gdb –q file  (-q: 不輸出冗餘信息)
  • 退出gdb調試:(gdb) quit

 

gdb常用命令

值得一提的是,輸入指令時按下一下tab,會自動補全指令;若有多個指令作爲候選,再按一下tab,就會出現所有可供選擇的命令。

另外,執行一個指令後,按一下回車,表示重複上一次的命令。

  • help

輸入help可查看命令的類別,輸入help+類別可進一步查看相關的命令,是非常有用的指令。

以下是輸入help後gdb展示的信息:

List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of commands in that class.
Type "help all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.

  • 源碼

list | l:查看10行源代碼

list | l + 行號:查看從指定行開始的源代碼

list | l + 函數名:查看指定函數的源代碼

set listsize + 長度:命令自定義輸出長度(最多一次性顯示23行)

  • 斷點

break | b + 行號或函數名:設置斷點

clear + 行號或函數名:清除指定斷點

delete | d + 斷點編號:清除指定編號的斷點(設置的每個斷點都會按順序分配好編號)

info breakpoints | i b:查看所有斷點

  • 運行

 start | s:開始運行程序,並停留在main函數的第一條指令處

run | r:開始運行程序,並停留在設置的第一個斷點處

next | n:執行下一行代碼,遇到函數不會跟蹤進入

step | s:執行下一行代碼,遇到函數會跟蹤進入

nexti | ni:執行下一行彙編代碼,遇到函數不會跟蹤進入

stepi | si:執行下一行彙編代碼,遇到函數會跟蹤進入

finish:連續運行到當前函數返回爲止,無法在main函數中使用

  • 打印

print | p + 變量:查看變量的值。

比較特殊的是,打印字符串s時,由於s存儲的是字符串的首地址,所以print s打印出來的是從s中存儲的地址開始,向後若干個字節中的數據對應的ASCII字符。要只打印出字符串(即'\0'前的數據),需要在變量名前加上(char*),即print (char*)s。

print | p + $寄存器:查看寄存器的值

print | p + &變量或寄存器:查看變量或寄存器的地址

print後加斜槓/和一個參數(如p/f),可進行格式化輸出。

  • x 或 a:按十六進制格式顯示變量。
  • u:按十六進制格式顯示無符號整型。
  • d:按十進制格式顯示變量。
  • o:按八進制格式顯示變量。
  • t:按二進制格式顯示變量。
  • c:按字符格式顯示變量。
  • f:按浮點數格式顯示變量。
  • 信息

info breakpoints | i b:查看所有斷點的信息

info locals | i locals:查看當前函數中變量的值

info registers | i reg:查看所有整數寄存器的值

  • 反彙編

disassemble | disass + 函數名:查看指定函數的彙編代碼

 

比較初級的調試步驟大概是:

  1. 用list指令查看源代碼
  2. 根據源碼用break設置斷點
  3. 用start或run運行程序
  4. 用next或step執行下一行代碼(如果是彙編代碼,用nexti或stepi)
  5. 在程序的運行過程中通過print或info locals查看變量的值(如果是彙編代碼,用info registers)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章