gdb命令序列

2021-10-21 23:50:09 字數 2176 閱讀 4592

除了斷點命令(請參見斷點命令列表),gdb還提供了兩種方法來儲存作為乙個單元執行的命令序列:使用者定義的命令和命令檔案。

使用者定義的命令是一系列gdb命令,我們可以使用乙個新名稱來指定這一串命令。這個過程通過define命令完成。使用者命令可以接受由空格分隔的無限數量的引數。引數在使用者命令中通過$arg0…$argn訪問。下面是乙個普通的例子:

define adder

print $arg0+$arg1+$arg2

end

我們可以這樣執行這個命令:

adder 1

23

上面就是我們定義adder的命令,這個命令會列印出三個引數的和。注意,引數是文字替換,因此它們可能引用變數、使用複雜表示式,甚至執行低階函式呼叫。

此外,$argc引數可能被用來探明到底傳遞了多少引數。

define adder

if $argc ==

2 print $arg0 + $arg1

endif $argc ==

3 print $arg0 + $arg1 +$ arg2

endend

結合eval命令(請參見eval)可以更輕鬆地處理數量可變的引數:

define adder

set $i =

0 set $sum =

0while $i < $argc

eval "set $sum = $sum +$arg%d"

, $i

set $i =$i +

1 end

print $sum

end

我們可以定義鉤子,這是一種特殊的使用者定義命令。每當執行命令foo時,如果使用者定義的命令hook-foo』存在,則鉤子就會在執行foo前執行(不帶引數)。

我們還可以定義在執行命令之後執行的鉤子。每當我們執行命令foo時,如果使用者定義的命令hookpost-foo存在,它將在該命令之後執行(不帶引數)。對於同一命令,執行後鉤子可以與執行前鉤子同時存在。

鉤子呼叫它鉤住的命令是有效的。如果發生這種情況,則不會重新執行鉤子,從而避免無限遞迴。

此外,還存在偽命令stop。定義hook-stop使程式中每次執行停止時都執行關聯的命令(也就是在執行斷點命令、列印顯示或列印堆疊幀之前)。

例如,要在單步執行時忽略sigalrm訊號,但在正常執行期間正常處理它們,可以定義:

define hook-stop

handle sigalrm nopass

enddefine hook-run

handle sigalrm pass

enddefine hook-

continue

handle sigalrm pass

end

再舉乙個例子,要在echo命令的開頭和結尾定義鉤子,並在訊息的開頭和結尾新增額外的文字,我們可以按照如下的方式定義:

define hook-echo

echo <<

<---

enddefine hookpost-echo

echo --

->

>>\n

end(gdb) echo hello world

<<

<

---hello world--

->

>>

(gdb)

我們可以為gdb中的任何單字命令定義鉤子,但不能為命令別名定義鉤子;我們應該為基本命令名定義鉤子,例如backtrace而不是bt。我們可以通過將hook-hookpost-新增到命令的最後乙個字來鉤子多字命令,例如define target hook-remote「將鉤子新增到target remote

如果在執行鉤子期間發生錯誤,gdb命令的執行將停止,gdb將發出提示(在您實際鍵入的命令有機會執行之前)。

如果嘗試定義與任何已知命令都不匹配的鉤子,則會從define命令得到警告。

gdb遠端序列協議

首先不知道這個標題翻譯得正不正確,其原文是 gdb remote serial protocol 這個是gdb在遠端除錯的時候,gdb端和gdbserver端通訊的協議。最近想看看arm linux,就想順便研究下這個協議。關於這個協議,有乙個文件,請見 翻譯開始 1.概述 在有些情況下,你需要知道...

gdb入門 gdb基本命令

參見 linux c程式設計一站式學習 backtrace 或bt 檢視各級函式呼叫及引數 finish 執行到當前函式返回,然後停下來等待命令 frame 或f 幀編號 選擇棧幀 info 或i locals 檢視當前棧幀區域性變數的值 list 或l 列出源 接著上次的位置往下列,每次列10行 ...

gdb除錯命令

一 gdb常用命令簡介 rrun 執行.程式還沒有執行前使用 c cuntinue 執行到下一斷點處 qquit 退出tab tab命令補全功能 h help幫助s step 跟入函式 nnext 執行下一行的 如果是函式呼叫,也當作一行 執行到此函式返回 b breakpoint 設定斷點,用法 ...