gdb 調試工具使用大全
一、常用命令
命令 | 命令縮寫 | 命令說明 |
---|---|---|
list | l | 顯示多行源代碼 |
break fun | b fun | 設置斷點 |
break N | b N | 在第n行打斷點 |
break file.c:N | b file.c:N | 在當前源文件file.c的第N行設置斷點 |
break classA::fun | b classA::fun | 在classA的fun函數處設置斷點 |
break if | b if | 當滿足某個條件時停止 |
delete N | d N | 刪除斷點(包括watch 點),一般先使用info命令查看斷點,之後使用d 斷點號刪除 |
disable | 禁用斷點 | |
enable | 允許斷點 | |
info | i | 描述程序狀態,比如: i b 顯示有哪些斷點,i th 哪些線程 |
run | r | 開始運行程序 |
display | disp | 跟蹤查看某個變量,每次停下來都顯示其值 |
p | 打印內部變量值 | |
watch | 監視變量值新舊的變化 | |
step N | s N | 執行下N條語句,如果該語句爲函數調用,則進入函數執行第N條語句 |
next | n | 執行下一條語句,如果該語句爲函數調用,不會進入函數內部執行(不會一步步地調試函數內部語句) |
continue | c | 繼續程序的運行,直到遇到下一個斷點 |
finish | 如果進入了某個函數,返回到調用調用它的函數,jump out | |
set var name = v | 設置變量的值 | |
backtrace | bt | 查看函數調用信息(堆棧) |
start | st | 開始執行程序,在main函數中的第一條語句前停下 |
frame | f | 查看棧幀,比如 frame 1 查看1號棧幀 |
quit | q | 離開gdb |
edit | 在gdb中進行編輯 | |
whatis | 查看變量的類型 | |
search | 搜索源文件中的文本 | |
file | 裝入需要調試的程序 | |
kill | k | 終止正在調試的程序 |
二、其他命令
2.1 tui界面
- 啓動使用設置
gdb -tui test
-
已經在gdb界面中,
ctrl+x, ctrl+a
切換tui界面。 -
界面切換
info win # 查看當前的focus,有src和cmd兩種
fs next # 上下切換focus
fs src # 切換到指定的focus
- layout切換
# 直接查詢幫助命令
help layout
# layout_name 可以是 src, asm, split, regs
layout prev | next | <layout_name>
- 線程調試
info threads # 顯示當前可調試的所有線程,每個線程會有一個GDB爲其分配的ID,後面操作線程的時候會用到這個ID。 前面有*的是當前調試的線程。
thread ID # 切換當前調試的線程爲指定ID的線程。
break thread_test.c:123 thread all # 在所有線程中相應的行上設置斷點
thread apply ID1 ID2 command # 讓一個或者多個線程執行GDB命令command。
thread apply all command # 讓所有被調試線程執行GDB命令command。
# 默認值off-->不鎖定任何線程
# on-->只有當前被調試程序會執行
# step 在單步的時候,除了next過一個函數的情況(熟悉情況的人可能知道,這其實是一個設置斷點然後continue的行爲)以外,只有當前線程會執行。
set scheduler-locking off|on|step
# 附着線程
ps -Tef | grep (程序名) # -T爲顯示所有線程
gdb attach thID # 附着線程進行調試
三、腳本
待完成