为什么 gdb "set" 命令不能识别全局变量,必须添加“::”或 "variable"?

Why gdb "set" command doesn't recognize global variable, must add "::" or "variable"?

我试图在 gdb 中设置值,我有:

int i=0;
int main(){
  ++i;
  int j=i+2;
  return 0;
}

在 "return" 处中断,并且 "r"

(gdb) set j=4
(gdb) set i=5
Ambiguous set command "i=5": .
(gdb) set ::i=6
(gdb) set variable i=6

奇怪,"j"是main中的局部变量,所以"set"没问题。 虽然 "i" 是全球性的,但我似乎应该添加“::”或 "variable" 来设置它。

我在网上搜索了一下,它说 "variable" 用于设置调试会话中使用的 gdb/reg 变量。

为什么 "i" 仍然需要 "variable"?

你的例子是:

(gdb) set i=5
Ambiguous set command "i=5": .

这不是名称查找错误,而是 gdb 解析命令的方式的结果。 (尾随的 : . 看起来应该有什么意思,或者列出什么;但它看起来很奇怪。)

set 可用于计算表达式,正如您在 set j = 4 中发现的那样——但这只是因为没有以 set j.[=23 开头的 gdb 命令=]

也就是说,set 首先尝试任何匹配的子命令,识别缩写。而且由于有多个命令以 set i 开头(例如 set inferior-ttyset input-radix、...),gdb 不知道该选择哪个。因此,它抱怨命令不明确。

设置变量的真正命令是set variable,这就是最后尝试成功的原因。

请注意,采用表达式的其他命令也可以评估赋值。我倾向于交互式地使用 p(又名 print)而不是 set variable,因为它更短。