【问题标题】:in gdb, can we set a variable as an expression?在 gdb 中,我们可以将变量设置为表达式吗?
【发布时间】:2021-12-14 06:22:40
【问题描述】:

在 u-boot C 代码中,值“gd”是这样声明的。 (手臂)

register volatile gd_t *gd asm ("r9")  

并且寄存器 r9 包含指向结构 global_data 的指针。 (typedef'd to gd_t)

在调试/分析时,要在 C 代码中查看 gd->malloc_base,键入“p gd->malloc_base”不起作用。它说Missing ELF symbol "gd"
后来我知道我应该执行“p ((gd_t *)$r9)->malloc_base” 来查看值。 我每天要多次输入这种命令。有没有办法可以在 gdb 中分配一个代表 ((gd_t *)$r9) 的变量?为什么 gdb 不能识别代码中的 gd 值?
我要做的是创建一个表示 ((gd_t *)$r9) 的变量,以便我可以根据我好奇的值像 gd->ram_top 或 gd->env_has_init 等使用它。

【问题讨论】:

  • 您是否考虑过使用 GDB 的 GUI 前端?通常,它提供“手表”或类似功能,让您免于重新输入。 - 另一个想法是定义一个“用户定义的命令”并调用它。请参阅 gdb 的文档。 -- 然后是display 命令,但它可能没有那么有用,因为每次调试对象停止时它都会打印。
  • 是的,按照您的建议,我尝试了“ddd --debugger arm-none-eabi-gdb u-boot -command=gdbsetup_arm”并添加了“graph disp /x *((gd_t *)$9 )”在命令中。我可以立即看到 gd 中不断变化的值。这不是一个坏方法(结构有点大,所以图形窗口应该更高,让源窗口更小。我尝试了“用户定义的命令”,但我想要的是替换 ((gd_t *)$r9 ) 部分,根据情况更改成员变量。但我认为现在使用 ddd 对我来说非常好。谢谢!(我更新了我的问题)
  • 大多数 IDE 都带有调试器 GUI,您尝试过吗? - 无论如何,如果您找到了解决方案,请随时发布您自己的答案并标记它。这将帮助其他人解决同样的问题。
  • 我的评论不是我想要的。我只是等待一个更好的答案。 (用 gdb 中的短变量替换表达式)。好的,我会在几天没有人出现时添加答案。 :)
  • 如果我需要这样的东西,我可能会使用macro define,比如macro define gd ((gd_t *)$r9)

标签: c gdb u-boot


【解决方案1】:

这是@ssbssa 对我的问题的评论(感谢@ssbssa)。我让他给出答案,但他没有。所以我自己添加了答案。
您可以定义像macro define gd ((gd_t *)$r0) 这样的宏,然后您可以稍后使用p /x gd->reloc_offp /x gd->flags。当然你可以把这个宏定义命令放在命令文件中,像arm-none-eabi-gdb u-boot -x gdb_command这样启动gdb。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2012-06-10
    • 2015-06-19
    相关资源
    最近更新 更多