GDB:如何从内置Python更改便利变量
我想知道如何在gdb的内置Python中给一个便利变量赋值。我以为这应该很简单,因为在实现用户自定义函数时自然会遇到这个问题。不过我找不到相关的信息。
更新:我添加了一个简化的例子。实际上,我的真实函数要复杂得多。不过,能找到一种方法把变量从Python传递到gdb会对我帮助很大。
使用示例(注意!——这会引发错误):
#accept a string, return it's lenght
define RetLenOfArg
py arg0 = gdb.parse_and_eval("$arg0")
set $Retrn = py len(arg0)
end
2 个回答
5
gdb有一个Python接口,可以用来获取或设置方便变量,具体内容可以参考文档。
函数:gdb.convenience_variable (name) 这个函数可以返回名为name的方便变量的值(具体可以查看方便变量的相关内容)。这里的name必须是一个字符串,而且在表达式中使用方便变量时,不要加上‘$’符号。如果这个方便变量不存在,函数会返回None。
函数:gdb.set_convenience_variable (name, value) 这个函数用来设置名为name的方便变量的值。name同样必须是一个字符串,且在表达式中不要加上‘$’符号。如果value是None,那么这个方便变量就会被删除。否则,如果value不是gdb.Value类型(可以查看来自下级的值),它会通过gdb.Value构造函数进行转换。
4
接受一个字符串,返回它的长度
如果你确实需要计算字符串的长度,可以使用 $_strlen
这个内置的 gdb 便利函数,它可以计算字符串的长度:
(gdb) set $Retrn=$_strlen("test")
(gdb) p $Retrn
$4 = 4
如何从内置的 Python 中将某个值赋给 GDB 的便利变量?
你可以使用 gdb.execute:
>more my_own_len.py
class my_own_len (gdb.Function):
def __init__ (self):
super (my_own_len, self).__init__ ("my_own_len")
def invoke (self, arg):
res=len(arg.string())
gdb.execute( "set $Retrn=" + str(res))
return res
my_own_len()
这是一个测试:
>gdb -q -x my_own_len.py
(gdb) p $_strlen("test")
$1 = 4
(gdb) p $my_own_len("test")
$2 = 4
(gdb) p $Retrn
$3 = 4
(gdb)