簡體   English   中英

是否可以在GDB調試器中“跳轉”/“跳過”?

[英]Is it possible to “jump”/“skip” in GDB debugger?

在GDB中調試時是否可以跳轉到代碼/可執行文件中的某個位置/地址?

假設我有類似以下的內容

int main()
{
  caller_f1() {  

   f1();  // breakpoint  
   f2() } // want to skip f2() and jump 

  caller_f2() { // jump to this this location ??       
   f1();  
   f2(); }  
}

似乎有一個跳轉命令正是您正在尋找的:

http://idlebox.net/2010/apidocs/gdb-7.0.zip/gdb_18.html#SEC163

更新鏈接: http ://web.archive.org/web/20140101193811/http: //idlebox.net/2010/apidocs/gdb-7.0.zip/gdb_18.html#SEC163

要在新地址繼續執行,請使用jump (短格式: j ):

jump LINENUM
jump *ADDRESS

GDB手冊建議在跳躍之前使用tbreak (臨時斷點)。

亞麻布可以是任何linespec表達式,例如下一行的+1

請參閱@ gospes關於相關問題的答案 ,以獲得一個方便的skip宏。


在非優化代碼( -O0 )中使用jump只是“安全” ,即使只在當前函數中使用。 它只修改程序計數器; 它不會改變任何其他寄存器或內存。

只有gcc -O0將每個源語句(或行?)編譯成一個獨立的指令塊,從內存加載變量值並存儲結果。 這允許您在任何斷點處使用調試器修改變量值,並使機器代碼中的行之間的jump工作,如在C源中的行之間跳轉。

這是為什么-O0制作如此慢的代碼的部分原因:編譯器不僅不花時間優化,還需要制作慢速代碼,在每個語句之后溢出/重新加載所有內容以支持異步修改變量甚至程序計數器。 (在典型的x86上,存儲/重新加載延遲約為5個周期,因此在-O0版本中,1個周期的add需要6個周期)。

gcc的手冊建議在通常的編輯 - 編譯 - 調試周期中使用-Og ,但即使是那種輕量級的優化也會破壞變量的jump和異步修改。 如果您不想在調試時這樣做,那么這是一個不錯的選擇,特別是對於-O0運行速度太慢以至於出現問題的項目。


要將程序計數器/指令指針設置為新地址而不恢復 ,您還可以使用:

set $pc = 0x4005a5

從反匯編窗口復制/粘貼地址( layout asm / layout reg )。

這相當於tbreak + jump ,但是你不能使用行號,只能使用指令地址。 (並且你沒有收到警告+確認請求跳過當前功能)。

然后你可以從那里stepi $pc是一個通用的gdb名稱,用於在目標體系結構中實際調用的寄存器。 例如,x86-64中的RIP。 (有關gdb的asm調試技巧,另請參閱標記wiki的底部。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM