天天看点

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 节。

继续阅读