1.1.1 斷點commands高級功能
大多數時候需要在斷點處執行一系列動作,gdb提供了在斷點處執行命令的高級功能commands。
#include <stdio.h>
int total = 0;
int square(int i)
{
int result=0;
result = i*i;
return result;
}
int main(int argc, char **argv)
{
int i;
for(i=0; i<10; i++)
{
total += square(i);
}
return 0;
}
比如需要對如上程序square參數i爲5的時候斷點,並在此時打印棧、局部變量以及total的值
編寫gdb.init如下:
set logging on gdb.log
b square if i == 5
commands
bt full
i locals
p total
print "Hit break when i == 5"
end
在gdb shell中source gdb.init,然後r執行命令,結果如下:
可以看出斷點在i==5的時候斷住了,並且此時打印了正確的值。
1.2 運行
“gdb 命令”之後,run可以在gdb下運行命令;如果命令需要參數則跟在run之後。
如果需要斷點在main()處,直接執行start就可以。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IrABIn0N-1587105273367)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1585212705097.png)]
1.3 顯示棧幀
如果遇到斷點而暫停執行,或者coredump可以顯示棧幀。
通過bt可以顯示棧幀,bt full可以顯示局部變量。
命令格式如下:
bt
bt full:不僅顯示backtrace,還顯示局部變量
bt N:顯示開頭N個棧幀
bt full N
1.4 顯示變量
“print 變量”可以顯示變量內容。
如果需要一行監控多個變量,可以通過p {var1, var2, var3}。
如果要跟蹤自動顯示,可以使用display {var1, var2, var3}
1.5 顯示寄存器
info reg可以顯示寄存器內容。
在寄存器名之前加$可以顯示寄存器內容,
p $寄存器:顯示寄存器內容
p/x $寄存器:十六進制顯示寄存器內容。
用x命令可以顯示內容內容,“x/格式 地址”。
x $pc:顯示程序指針內容
x/i $pc:顯示程序指針彙編。
x/10i $pc:顯示程序指針之後10條指令。
x/128wx 0xfc207000:從0xfc20700開始以16進制打印128個word。
1.9 改變變量的值
“通過set variable <變量>=<表達式>”來修改變量的值。
set $r0=xxx:設置r0寄存器的值爲xxx。
1.13 初始化文件
Linux環境下初始化文件爲.gdbinit。
如果存在.gdbinit文件,gdb在啓動的之前就將其作爲命令文件運行。
初始化文件和命令文件執行順序爲:HOME/.gdbinit > 運行命令行選項 > ./.gdbinit > -x指定命令文件。
define命令宏
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NGUP7vno-1587105273377)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1585293921956.png)]
用define創建的命令宏,可以與commands內使用,很靈活。
https://www.cnblogs.com/arnoldlu/p/9633254.html
1.14 gdb commands命令用法
//設置斷點
(gdb) b rx_data
Breakpoint 1 at 0xffffffffa02cccf8: file drivers/target/iscsi/iscsi_target_util.c, line 1347.
(gdb) commands
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
/*輸入當運行到斷點時想執行的命令(單個或多個),輸入end表示命令輸入完成
例子中表示,打印c.iov的值,以及繼續執行,兩條命令*/
>p c.iov
>c
>end
/*設置完成後,輸入info br,會出現類似以下的提示*/
(gdb) info br
Num Type Disp Enb Address What
1 breakpoint keep y 0xffffffffa02cccf8 in rx_data at drivers/target/iscsi/iscsi_target_util.c:1347
p c.iov
c
/*如果有多個斷點,需要設置不同斷點被斷住時自動執行的命令,則可輸入commands num實現設置,例如:*/
(gdb) commands 1
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>p c.type
>c
>end
/*結果如下*/
(gdb)info br
Num Type Disp Enb Address What
1 breakpoint keep y 0xffffffffa02cccf8 in rx_data at drivers/target/iscsi/iscsi_target_util.c:1347
p c.type
c
/*如果想清空斷點的命令,輸入commands num後,直接輸入end即可*/
(gdb)commands 1
>end
(gdb)info br
(gdb)info br
Num Type Disp Enb Address What
1 breakpoint keep y 0xffffffffa02cccf8 in rx_data at drivers/target/iscsi/iscsi_target_util.c:1347
/*在運行過程中經常出現: --Type <return> to continue, or q<return> to quit. 程序就被阻塞了,需要人手動敲一下回車才能繼續。可通過設置height解決*/
(gdb)set height 0
fffa02cccf8 in rx_data at drivers/target/iscsi/iscsi_target_util.c:1347
/在運行過程中經常出現: --Type to continue, or q to quit. 程序就被阻塞了,需要人手動敲一下回車才能繼續。可通過設置height解決/
(gdb)set height 0