gdb斷點commands高級功能

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之後。

img

如果需要斷點在main()處,直接執行start就可以。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IrABIn0N-1587105273367)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1585212705097.png)]

1.3 顯示棧幀

如果遇到斷點而暫停執行,或者coredump可以顯示棧幀。

通過bt可以顯示棧幀,bt full可以顯示局部變量。

img

命令格式如下:

bt

bt full:不僅顯示backtrace,還顯示局部變量

bt N:顯示開頭N個棧幀

bt full N

1.4 顯示變量

“print 變量”可以顯示變量內容。

img

如果需要一行監控多個變量,可以通過p {var1, var2, var3}。

如果要跟蹤自動顯示,可以使用display {var1, var2, var3}

1.5 顯示寄存器

info reg可以顯示寄存器內容。

img

在寄存器名之前加$可以顯示寄存器內容,

p $寄存器:顯示寄存器內容

p/x $寄存器:十六進制顯示寄存器內容。

img

用x命令可以顯示內容內容,“x/格式 地址”。

x $pc:顯示程序指針內容

x/i $pc:顯示程序指針彙編。

x/10i $pc:顯示程序指針之後10條指令。

x/128wx 0xfc207000:從0xfc20700開始以16進制打印128個word。

img

1.9 改變變量的值

“通過set variable <變量>=<表達式>”來修改變量的值。

img

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章