天天看點

Hexagon GDB Debugger介紹(4)

Hexagon GDB Debugger介紹(4)

    • 2.5調試器指令
      • 2.5.1 指令縮寫
      • 2.5.2 指令重複
      • 2.5.3 指令完成

2.5調試器指令

調試器指令作為單行文本輸入在調試器指令行(第 2.3 節)上輸入。 它們由一個指令名稱後跟零個或多個參數組成,其含義取決于指令。

例如,指令 step 接受一個參數,該參數指定單步執行程式的次數。 例如:

$ step 5
           

在某些指令(例如 step)上,參數是可選的并具有預設值。調試器支援以下指令快捷方式:

  • 指令名稱可以縮寫為指令名稱的前幾個字母
  • 某些指令可以通過簡單地輸入鍵來重複
  • 輸入鍵可以自動補全指令名

2.5.1 指令縮寫

如果結果相對于其他調試器指令沒有歧義,則可以在指令行中以縮寫形式輸入調試器指令名稱。

在某些情況下,甚至允許使用不明确的縮寫。 例如,即使存在名稱以 s 開頭的其他調試器指令,s 也被識别為 step 的縮寫。 本章中的指令說明中列出了這些正常縮寫。

注意
    指令縮寫可以通過将它們作為參數傳遞給 help 指令來測試其有效性(第 2.5.7 節)。

    當 Tcl 腳本被啟用(第 4.4 節)時,調試器不支援标準 GDB 中可用的所有指令縮寫,因為 Tcl 指令名稱被添加到調試器指令命名空間中。
           

2.5.2 指令重複

在大多數情況下,在調試器指令行中輸入一個空行(即,僅鍵入 )會導緻重複先前的調試器指令。 某些指令(例如 run 和 target)不支援此功能,要麼是為了防止可能導緻問題的無意重複,要麼是因為你不太可能想要重複該指令。

重複時,list 和 x 指令更新它們的參數,而不是完全按照最初鍵入的方式重複。 這可以輕松掃描源或記憶體。

調試器還可以以另一種方式使用 :以類似于通用實用程式的方式對冗長的輸出進行分區(參見第 3.4.4 節)。 由于在這種情況下很容易按太多 ,是以在生成此類顯示的任何指令後禁用指令重複。

Ctrl-o 綁定對于重複複雜的指令序列很有用。 該指令接受目前行,如 ,然後從指令曆史記錄(第 3.4.3 節)中擷取相對于目前行的下一行進行編輯。

2.5.3 指令完成

如果隻存在一種可能性,調試器可以為你填寫指令中單詞的其餘部分。 它還可以随時向你顯示指令中下一個單詞存在哪些有效可能性。 這适用于調試器指令、子指令和程式中的符号名稱。

每當你希望調試器自動完成單詞的其餘部分時,請按 鍵。 如果隻存在一種可能性,調試器會完成單詞并等待你完成指令(或按 鍵輸入)。 例如,如果你鍵入:

(hexagon-gdb) info bre <TAB>
           

…調試器填充斷點這個詞的其餘部分,因為這是唯一以“bre”開頭的 info 子指令:

(hexagon-gdb) info breakpoints
           

此時你可以按 來運作 info breakpoints 指令,或者如果斷點看起來不像你期望的指令,則倒退并輸入其他内容。 (如果你确定首先需要資訊斷點,你不妨在 info bre 後立即鍵入 ,以利用指令縮寫而不是指令完成)。

如果按下 時下一個單詞存在多個可能性,調試器會鳴響。 你可以提供更多字元并重試,也可以再次按 鍵; 調試器然後顯示該單詞的所有可能的補全。

例如,你可能希望在名稱以 make_ 開頭的子例程上設定斷點,但是當你鍵入 b make_ 時,調試器隻會響鈴。 再次鍵入 會顯示程式中以這些字元開頭的所有函數名稱,例如:

(hexagon-gdb) b make_ <TAB>
           

當你鍵入 時,調試器會鳴響; 再次輸入 會出現以下内容:

make_a_section_from_file     make_environ
make_abs_section             make_function_type
make_blockvector             make_pointer_type
make_cleanup                 make_reference_type

make_command                 make_symbol_completion_list

(hexagon-gdb) b make_
           

顯示可用的可能性後,調試器複制你的部分輸入 (示例中為 b make_),以便你可以完成指令。

如果你隻想首先檢視備選清單,你可以按 M-? 而不是按 兩次。 米-? 表示 ?。 你可以通過在鍵入 ? 時按住鍵盤上指定為 移位的鍵(如果有)來鍵入該鍵,也可以按 後跟 ?。

有時,你需要的字元串雖然在邏輯上是一個“詞”,但可能包含括号或其他字元,調試器通常會從其詞的概念中排除這些字元。 要允許單詞完成在這種情況下工作,你可以在調試器指令中将單詞括在單引号 (’) 中。

你可能需要這樣做的最可能情況是鍵入 C++ 函數的名稱。 這是因為 C++ 允許函數重載(同一函數的多個定義,按參數類型區分)。

例如,當你想設定斷點時,你可能需要區分你是指采用 int 參數 name(int) 的 name 版本還是采用 float 參數 name(float) 的版本。 要在這種情況下使用單詞補全功能,請在函數名稱的開頭鍵入單引号 (’)。 這會提醒調試器,當你按 或 M-? 時,它可能需要考慮比平時更多的資訊。 請求單詞完成:

(hexagon-gdb) b ’bubble( M-?
bubble(double,double)    bubble(int,int)

(hexagon-gdb) b ’bubble(
           

在某些情況下,調試器可以判斷完成名稱需要使用引号。 發生這種情況時,如果你沒有首先輸入引号,它會為你插入引号(同時盡可能多地完成):

(hexagon-gdb) b bub <TAB>
           

調試器将你的輸入行更改為以下内容,并響鈴:

(hexagon-gdb) b ’bubble(
           

通常,如果你在要求完成重載符号時尚未開始輸入參數清單,它可以告訴你需要(并插入)引号。

有關重載函數的更多資訊,請參閱第 2.15.4.4 節。 你可以使用指令 setoverload-resolution off 來禁用重載解析; 見第 2.15.4.8 節。

繼續閱讀