GDB:有什么方法可以构造 "Local" 方便的变量吗?
GDB: Is there some way to construct "Local" convenient variables?
我有一个实时 OO 程序(不过是用 C 语言编写的),我正在尝试调试它。我有一个问题,在特定的 window 时间内,数千个对象中的某些对象时不时地被损坏。我想在 window 的开头设置一个断点,它会自动在成员变量上设置一个观察点,然后在 window 的末尾通过另一个断点删除该观察点。问题是我需要某种方法将观察点编号绑定到给定对象。如果我可以通过某种机制构造一个方便的变量,例如,如果 $var=28
,那么 set $x${var}=watch -l foo
将等同于 set $x28=watch -l foo
。 (这实际上不起作用)这将允许我这样做:
breakpoint obj_init+23
command
$var = *obj
$x${var} = watch -l foo
continue
done
breakpoint obj_final
command
$var = *obj
delete $x${var}
continue
done
所以我(希望)不会超出可用硬件观察点的数量。
有谁知道我如何在不尝试编写 python 扩展的情况下实现这一点? (我的python很生疏。)
您可以使用 GDB 的 eval 命令来设置和使用名称由数字或字符串表达式的结果组成的变量。
您可以将 eval 视为对其参数执行 printf,然后执行结果字符串。 eval "set var $x%d = 1", 5
将 运行 命令 set var $x5 = 1
.
您需要的另一条信息是,与所有断点命令一样,watch 命令会将便利变量 $bpnum
设置为断点编号。
break obj_init+23
commands
set var $var = *obj
watch -l foo
eval "set var $x%d = $bpnum", $var
continue
done
break obj_final
commands
set var $var = *obj
eval "delete $x%d", $var
continue
done
我有一个实时 OO 程序(不过是用 C 语言编写的),我正在尝试调试它。我有一个问题,在特定的 window 时间内,数千个对象中的某些对象时不时地被损坏。我想在 window 的开头设置一个断点,它会自动在成员变量上设置一个观察点,然后在 window 的末尾通过另一个断点删除该观察点。问题是我需要某种方法将观察点编号绑定到给定对象。如果我可以通过某种机制构造一个方便的变量,例如,如果 $var=28
,那么 set $x${var}=watch -l foo
将等同于 set $x28=watch -l foo
。 (这实际上不起作用)这将允许我这样做:
breakpoint obj_init+23
command
$var = *obj
$x${var} = watch -l foo
continue
done
breakpoint obj_final
command
$var = *obj
delete $x${var}
continue
done
所以我(希望)不会超出可用硬件观察点的数量。
有谁知道我如何在不尝试编写 python 扩展的情况下实现这一点? (我的python很生疏。)
您可以使用 GDB 的 eval 命令来设置和使用名称由数字或字符串表达式的结果组成的变量。
您可以将 eval 视为对其参数执行 printf,然后执行结果字符串。 eval "set var $x%d = 1", 5
将 运行 命令 set var $x5 = 1
.
您需要的另一条信息是,与所有断点命令一样,watch 命令会将便利变量 $bpnum
设置为断点编号。
break obj_init+23
commands
set var $var = *obj
watch -l foo
eval "set var $x%d = $bpnum", $var
continue
done
break obj_final
commands
set var $var = *obj
eval "delete $x%d", $var
continue
done