【问题标题】:gdb in C: Get type of variable as stringC中的gdb:以字符串形式获取变量类型
【发布时间】:2019-12-18 14:38:16
【问题描述】:

我想看看是否可以将 gdb 中的变量类型作为字符串获取。例如,如果

int i = 1;
MyStruct *ms = NULL;

然后我想得到类似的东西

(gdb) <the-command-I-am-looking-for> i $local_var_i
(gdb) p $local_var_i
      $local_var_i = "int"
(gdb) <the-command-I-am-looking-for> ms $local_var_ms
(gdb) p $local_var_ms
      $local_var_ms = "MyStruct *"

我可能在上述代码段之前分配了局部变量,命令可能是自定义命令。

这样的事情可能吗?我怎样才能做到这一点?

编辑澄清: 我的程序中有一组函数可以根据它们所服务的类型更改名称(我知道这不是最好的方法,但我无法更改)。我想编写一个 gdb 函数,我可以只输入变量,其余的将自动完成,无需我的干预。最好,我也想避免 if/else if 的墙。

【问题讨论】:

  • 这能回答你的问题吗? gdb: show typeinfo of some data
  • 不,它没有。我已经看到了这个答案。我想将变量的类型作为字符串自动使用,我不想手动复制它。
  • 您需要解决的实际问题是什么?为什么需要将类型作为调试器变量中的字符串?如果只是出于好奇也没关系(但请在问题中说明),否则最好直接询问您遇到的问题,而不是询问可能的解决方案。请阅读the XY problem,并思考它与您的问题有何关系。
  • 我的程序中有一组函数可以根据它们所服务的类型更改名称(我知道这不是最好的方法,但我无法更改)。我想编写一个 gdb 函数,我可以只输入变量,其余的将自动完成,无需我的干预。最好,我也想避免 if/else if 的墙
  • 为了清楚起见,给定一个类型为MyCarType 的指针p,您想要在gdb 中推断名称polymethod_MyCarType(MyCarType* ptr) 吗?

标签: c gdb


【解决方案1】:

如果您的 gdb 支持 python 脚本扩展,您可以这样尝试:

define type2var
  eval "python gdb.execute(\"set $%s=\\\"\"+(gdb.execute(\"ptype %s\", False, True)).strip()+\"\\\"\")",$arg1,$arg0
end

现在你可以这样称呼它:

>>> type2var "variable" "typevar"
>>> print $typevar
$1 = "type = char [32]"

您当然可以根据需要使用 python 字符串函数对其进行进一步格式化。

【讨论】:

  • 它可能需要一些调整,但我认为我可以使用它。我稍后会回复你。谢谢!
  • 谢天谢地,我的 gdb 确实支持 python 脚本扩展。最后,这就是我需要的东西:eval "python gdb.execute(\"set $_type_=\\\"\"+(gdb.execute(\"whatis $arg0\", False, True)).strip()+\"\\\"\")" 我这样称呼它:type2var myvar print $_type_ $1 = "type = char [32]" 正如你所看到的,我可以预先命名局部变量 $_type_。我还没有研究过 TrueFalse 参数的定义,但既然它有效,我想它并不那么重要。非常感谢您的快速回复!
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多