我已经寻求所有的互联网,我尽我所能,但最后我找不到任何解决方案:如何为 GDB 便利变量分配一些内容内置的 python ?
我想知道:这应该是一个简单的解决方案,因为我认为这是在尝试实现用户定义函数时出现的主要问题。但我甚至找不到这样一个问题,这太奇怪了......
UPD:添加了一个示例。虽然它很简单 - 在我的真正的函数中,我需要使用指针,这在python中是不存在的......无论如何,一种传递变量的方法 从 python 到 gdb 本身可以帮助我。
一个简单的例子(achtung! - 不起作用):
#accept a string, return it's lenght
define RetLenOfArg
py arg0 = gdb.parse_and_eval("$arg0")
set $Retrn = py len(arg0)
end
上面的示例会引发错误。
答案 0 :(得分:3)
接受一个字符串,返回它的长度
如果你确实需要strlen,你可以使用$_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)
答案 1 :(得分:2)
存在的gdb的python API用于获取/设置便捷性变量:来自https://cryptii.com/pipes/W21RJA
功能: gdb.convenience_variable(名称)返回 便捷变量(请参见Convenience Vars)命名为name。名称必须是 串。名称中不应包含用于标记“ 表达式中的便捷变量。如果方便变量 不存在,则返回None。
功能: gdb.set_convenience_variable(名称,值) 便利变量(请参见Convenience Vars)命名为name。名称必须 是一个字符串。名称中不应包含用于标记的“ $” 表达式中的便利变量。如果值为None,则 便利变量已删除。否则,如果值不是 gdb.Value(请参见劣等值),使用 gdb.Value构造函数。