gdb常用命令及参考文档
gdb常用命令及參考文檔
- 前言
- 使能方式
- 啟動方式
- 常用命令
- !
- help
- proc
- l/list
- b、break + line 或者函數名
- break-if
- delete、 clear
- info
- r/run
- n
- s/step
- p/print
- 打印數組
- set
- finish
- c/continue
- kill
- file
- watch
- start
- display/disp
- catch
- x
- 技巧
- backtrace/bt
- frame/f
- args
- 信號調試
- 多線程調試
- attach
- coredump 文件
- 開始調試core文件
- 使用gdb dump內存
- gdb讀取內存
- 使用gdb打印棧幀
- 參考鏈接
- 調試心得
前言
本文的目的只是為了列述gdb常用命令,供日常調試時自查
使能方式
編譯的時候加上-g 去掉-s選項
-s strip - Discard symbols from object files.
-fvisibility=hidden 這個也不能加
-g gdb 編譯 -g3 3只是級別。這個級別會產生更多的額外debug信息。3這個級別可以調試宏。
啟動方式
gdb -xxx # 如果想要增加更多啟動參數 gdb --args ./SSDTEST.exe -slot 1 -ns 1 -sn 1 #后面加上所有的參數常用命令
!
在gdb內部使用!開頭的命令,可以直接調用外部命令,如
(gdb) ! grep heap /proc/1131/maps 00c7d000-00d94000 rw-p 00000000 00:00 0 [heap]help
幫助信息
proc
顯示/proc中的一些信息
(gdb) help info proc Show /proc process information about any running process. Specify any process id, or use the program being debugged by default.List of info proc subcommands:info proc all -- List all available /proc info info proc cmdline -- List command line arguments of the process info proc cwd -- List current working directory of the process info proc exe -- List absolute filename for executable of the process info proc mappings -- List of mapped memory regions info proc stat -- List process info from /proc/PID/stat info proc status -- List process info from /proc/PID/statusl/list
list 顯示多行源代碼
b、break + line 或者函數名
加斷點
同理也可以對多個文件中的某一個文件的函數打斷點,例: b gdb_test.c:func
break-if
利用break if命令,可以設置一個條件斷點,如下
break line-or-function if expr例:
break 46 if testsize==100delete、 clear
如果我們想刪除某個斷點,有兩種方法:
- delete break 刪除所有的斷點
- delete break n 刪除某個斷點 n為斷點號
- clear 行號 刪除設在某一行的斷點
info
info、delete、clear 后面可以加很多東西, 包括,break, watch, display
| info break/breakpoint | 查看斷點 |
| info break/breakpoint N | 查看第N個斷點 |
| info local | 或locals 查看當前stack frame局部變量 |
| info variables | 查看全局和靜態變量 |
| info args | 查看當前stack frame參數 |
| info thread | 查看所有的thread |
r/run
開始
n
單步執行,但是不會進入函數內部
s/step
單步執行,會進入函數內部
p/print
print查看當前某個變量 p空格后面加變量名
打印數組
可以用以下各式打印數組,頭指針頭加@數量
p *arrayPtr@256set
使用set或者print可以修改變量的值
print array[1] = 12 set variable array[1] = 12finish
跳出某個函數
c/continue
繼續運行
kill
退出調試
file
裝入需要調試的exe file
watch
監視變量
start
開始執行程序,在main函數的第一條語句前面停下來
display/disp
跟蹤查看某個變量, 每次停下來都現實哦
catch
捕捉
catch assert -- Catch failed Ada assertions catch catch -- Catch an exception ####重要 catch exception -- Catch Ada exceptions catch exec -- Catch calls to exec catch fork -- Catch calls to fork catch load -- Catch loads of shared libraries catch signal -- Catch signals by their names and/or numbers catch syscall -- Catch system calls by their names and/or numbers catch throw -- Catch an exception catch unload -- Catch unloads of shared libraries catch vfork -- Catch calls to vforkx
查看內存
格式: x /nfu <addr>
說明:
x 是 examine 的縮寫
n表示要顯示的內存單元的個數
f表示顯示方式, 可取如下值
x 按十六進制格式顯示變量。
d 按十進制格式顯示變量。
u 按十進制格式顯示無符號整型。
o 按八進制格式顯示變量。
t 按二進制格式顯示變量。
a 按十六進制格式顯示變量。
i 指令地址格式
c 按字符格式顯示變量。
f 按浮點數格式顯示變量。
u表示一個地址單元的長度
b表示單字節,
h表示雙字節,
w表示四字節,
g表示八字節
舉例
x/3uh buf技巧
可以使用如下命令,把一個內存地址轉化為一個指針并打印
p *(struct virtio_net*)0x20007ffefa00backtrace/bt
查看函數調用信息(堆棧)
frame/f
查看站幀(目前運行到的地方)
args
啟動程序的三種方式
信號調試
handle <signal> <keywords...>- 在GDB中定義一個信號處理。信號可以以SIG開頭或不以SIG開頭,可以用定義一個要處理信號的范圍(如:SIGIO- SIGKILL,表示處理從SIGIO信號到SIGKILL的信號,其中包括SIGIO, SIGIOT,SIGKILL三個信號),也可以使用關鍵字 all來標明要處理所有的信號。一旦被調試的程序接收到信號,運行程序馬上會被GDB停住,以供調試。其可以是以下幾種關鍵字的一個或多個。
| nostop | 當被調試的程序收到信號時,GDB不會停住程序的運行,但會打出消息告訴你收到這種信號。 |
| stop | 當被調試的程序收到信號時,GDB會停住你的程序。 |
| 當被調試的程序收到信號時,GDB會顯示出一條信息。 | |
| noprint | 當被調試的程序收到信號時,GDB不會告訴你收到信號的信息。 |
| pass/noignore | 當被調試的程序收到信號時,GDB不處理信號。這表示,GDB會把這個信號交給被調試程序會處理。 |
| nopass/ignore | 當被調試的程序收到信號時,GDB不會讓被調試程序來處理這個信號。 |
多線程調試
attach
- 常規的通過gdb cmd這種方式開啟調試,特別說明的是通過attach的方法附加到一個指定的進程上去進行調試,這種方法適合于調試一個已經運行的進程,具體用法:gdb -p [pid]
- 此時被attach的進程會阻塞,進入T模式(ps 命令看到STATE為T),如果調試完畢了,使用 detach 命令就釋放了進程,它就自由運行了。
coredump 文件
- 開啟coredump
- 設置coredump的命名規則
- 通過cat /proc/sys/kernel/core_pattern 驗證設置的pattern
開始調試core文件
調試的話輸入: gdb filename core
filename就是產生core文件的可執行文件,core就是產生的dump文件
使用gdb dump內存
然后可以使用如[xxd](https://man.cx/ xxd(1))查看內存
gdb讀取內存
– (gdb) define xxd dump binary memory dump.bin $arg0 $arg0+$arg1 shell xxd dump.bin shell rm -f dump.bin end (gdb) xxd 0x00007f3498000000 32 0000000: 2000 001c 367f 0000 0000 00a4 347f 0000 ...6.......4... 0000010: 0000 0004 0000 0000 0000 0004 0000 0000 ................使用gdb打印棧幀
gdb中輸入
set logging file my_back_trace.txt thread apply all bt full quit或者把上述命令放到一個文件gdb-instructions.txt中并執行命令
echo -ne "set logging file my_back_trace.txt\nthread apply all bt full\nquit" > gdb-instructions.txt gdb /exe $(pidof exe) -x gdb-instructions.txt參考鏈接
調試心得
總結
以上是生活随笔為你收集整理的gdb常用命令及参考文档的全部內容,希望文章能夠幫你解決所遇到的問題。