GDB:如何从内置Python更改便利变量

4 投票
2 回答
2111 浏览
提问于 2025-04-18 03:14

我想知道如何在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)

撰写回答