GDB能否将表达式设为自定义变量?U-Boot调试时gd符号无法识别如何解决
问题原因:GDB无法识别gd变量的根源
你代码中声明的gd是通过register ... asm("r9")语法绑定到硬件寄存器的专用变量,这类变量在编译时会被直接固定使用r9寄存器存储,不会在内存中分配存储地址,也不会在ELF文件的符号表中生成对应的符号条目。GDB只能读取ELF调试信息中存在的符号,因此查询gd时会提示符号不存在。
解决方案:设置GDB快捷指代
可以通过GDB的便利变量功能实现你要的快捷查询效果,分为临时生效和永久生效两种方案:
临时生效(仅当前调试会话可用)
在GDB命令行直接执行以下命令即可:
set $gd = (gd_t *)$r9
配置完成后,你就可以直接用p $gd->malloc_base、p $gd->ram_top、p $gd->env_has_init这类语法查询对应成员。如果想要完全和代码语法一致不带$前缀,可以额外执行别名配置:
alias gd = $gd
之后就可以直接用p gd->malloc_base的语法查询。
永久生效(所有U-Boot调试会话自动生效)
你可以把配置写入GDB初始化文件,避免每次调试都重复输入:
- 如果仅需要U-Boot项目生效,在U-Boot源码根目录创建
.gdbinit文件,写入以下内容:
# U-Boot gd寄存器快捷映射 set $gd = (gd_t *)$r9 alias gd = $gd
- 如果需要全局生效,将上述配置写入用户目录下的
~/.gdbinit文件即可。
注意:需要确保你加载的U-Boot二进制是带调试符号编译的版本(编译时添加
-g参数),否则GDB无法识别gd_t结构体定义,无法正常解析成员。
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

