【发布时间】: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)。