gdb attach除錯程序

2021-08-10 01:38:21 字數 3153 閱讀 9248

進入除錯:

ps命令檢視程序id。 

執行gdb attach pid即可除錯正在執行的程式。 

info proc顯示當前程式可執行檔案相關資訊(name,pwd)

斷點相關:

b pkt.c:22(在pkt.c檔案的22行打斷點) 

b eth_rcv (在函式eth_rcv入口打斷點) 

info b;顯示當前所有斷點; 

d num;刪除斷點num; 

n num;向後執行num步

bt顯示當前函式的呼叫過程;

列印變數值:

p temp;預設十進位制列印 

p /x temp;按十六進製制列印 

x 按十六進製制格式顯示變數。 

d 按十進位制格式顯示變數。 

u 按十六進製制格式顯示無符號整型。 

o 按八進位制格式顯示變數。 

t 按二進位制格式顯示變數。 

a 按十六進製制格式顯示變數。 

c 按字元格式顯示變數。 

f 按浮點數格式顯示變數。 

顯示變數型別:whatis var;顯示var變數的型別 

顯示變數的結構體成員: ptype var ;顯示var型別結構體的成員

gdb中的變數:

程式的變數和gdb的變數是可以互動的,gdb中的變數以開頭

,如i。

set

$i=0

print a[$i++]

即可實現列印以a位址起始的記憶體中的值。

條件進入斷點:

如:b arp_rcv if index = 1234(當index=1234時進入斷點,注意是單等號)

檢視記憶體:

x /x 以十六進製制輸出 

x /d 以十進位制輸出 

x /c 以單字元輸出 

x /i 反彙編 – 通常,我們會使用 x/10i ip

−20來查

看當前的

彙編( ip是指令暫存器) 

x /s 以字串輸出

列印指定記憶體起始100位元組內容: 

x /100ua pkt->data

設定臨時變數:

set i=

msg−

>ms

gdat

apri

nti列印變數msg->msg_data指標; 

ptype $i 列印msg->msg_data型別

command命令:

自動化除錯,把一組gdb的命令打包。執行到斷點處時自動執行一系列命令。 

如:breakpoint 1

at0x191a8: file ftm_pkt.c, line

204.

(gdb) command

1type commands for

breakpoint(s) 1, one per line.

end with

aline saying just "end".

>p /x pmesg

>p /x pmesg->msg_data

>

>end

(gdb) c

continuing.

204 ftm_pkt.c: no such file

ordirectory.

$1 = 0x45b2c

$2 =

(gdb)

呼叫函式:

(gdb) call func() 

如: (gdb) call printf(「hello world!\n」);

重定向標準輸出stdout和stderr:

1)先關閉 stdout ,和 stderr 對應的檔案描述符。 

(gdb) call (int)close(1) 

(gdb) call (int)close(2) 

2)然後使用以下命令檢視一下當前 gdb 視窗所在的虛擬終端。 

(gdb) shell tty 

/dev/pts/0 

3)這時再重新開啟 stdout 和 stderr , 把它們和 gdb 視窗所在的虛擬終端關聯起來。 

(gdb) p (int)open(「/dev/pts/0」, 2) 1=

1(gd

b)p(

int)

open

(「/d

ev/p

ts/0

」,2)

2 = 2 

如果這兩個命令執行結果不是如上結果(1和2),意味著 open 執行失敗,需要重新進行 close 和 open. 

4)接下來,重新執行如下命令: 

call printf(「helllo world\n」);即可直接在gdb除錯視窗看到列印資訊。 

5)即時重新整理 stdout 和 stderr 

呼叫 fflush強制重新整理緩衝區: 

(gdb)call (int)fflush(0)

另外,如果把這裡的 」/dev/pts/0」 替換成目標檔名,便可將 stderr 和 stdout 重定向到該檔案。

使用shell模式下的命令:

(gdb) define tar 

end with a line saying just 「end」.

shell tar 

end

(gdb)tar 即可使用shell模式下tar命令,模擬可得到其他命令。

以下未驗證:

watch div1==div2當變數div1yu div2相等時進入中斷。 

info thread 檢視當前程序的執行緒。 

thread 切換除錯的執行緒為指定id的執行緒。 

break file.c:100 thread all 在file.c檔案第100行處為所有經過這裡的執行緒設定斷點。 

set scheduler-locking off|on|step,這個是問得最多的。在使用step或者continue命令除錯當前被除錯執行緒的時候,其他執行緒也是同時執行的,怎麼只讓被除錯程式執行呢?通過這個命令就可以實現這個需求。 

off 不鎖定任何執行緒,也就是所有執行緒都執行,這是預設值。 

on 只有當前被除錯程式會執行。 

step 在單步的時候,除了next過乙個函式的情況(熟悉情況的人可能知道,這其實是乙個設定斷點然後continue的行為)以外,只有當前執行緒會執行。

多程序除錯

實際上,gdb 沒有對多程序程式除錯提供直接支援。例如,使用gdb除錯某個程序,如果該程序fork了子程序,gdb會繼續除錯該程序,子程序會不受干擾地執行下去。如果你事先在子程序 裡設定了斷點,子程序會收到sigtrap訊號並終止。那麼該如何除錯子程序呢?其實我們可以利用gdb的特點或者其他一些輔助...

非root不能gdb attach的限制

could not attach to process.if your uid matches the uid of the target process,check the setting of proc sys kernel yama ptrace scope,or try again as t...

非root不能gdb attach的限制

could not attach to process.if your uid matches the uid of the target process,check the setting of proc sys kernel yama ptrace scope,or try again as t...