如何在GDB中保存符号文件名并传递变量以编写通用调试脚本?
通用GDB脚本实现Yocto构建U-Boot的远程调试
用交叉编译GDB(比如x-compiler-gdb path/to/u-boot)调试Yocto/BitBake构建的U-Boot时,现有调试流程为:
- 连接远程会话(
target extended-remote :3333) - 获取重定位地址并存到
$1 - 移除符号文件
- 重加载符号文件
但当前脚本硬编码了远程IP和符号文件名,以下是实现动态参数传入和符号文件路径复用的通用解决方案:
通用调试脚本(uboot_debug.gdb)
# 设置默认参数,可被外部传入值覆盖 set $remote_ip = "localhost" set $remote_port = 3333 set $uboot_symfile = "" # 接收外部传入的U-Boot文件路径(第一个参数) if $argc >= 1 set $uboot_symfile = $arg0 # 加载初始符号文件(若启动GDB时已指定U-Boot路径,可省略此句) file $uboot_symfile end # 接收远程IP(第二个参数) if $argc >= 2 set $remote_ip = $arg1 end # 接收远程端口(第三个参数) if $argc >= 3 set $remote_port = $arg2 end # 1. 连接远程目标 printf "Connecting to %s:%d...\n", $remote_ip, $remote_port target extended-remote ${remote_ip}:${remote_port} # 2. 获取重定位地址(以U-Boot的__image_copy_start为例,按需替换) printf "Getting relocation address...\n" set $1 = &__image_copy_start # 3. 移除当前符号文件 printf "Removing existing symbols...\n" remove-symbol-file # 4. 重加载符号文件到重定位地址 printf "Reloading symbols from %s at 0x%x...\n", $uboot_symfile, $1 add-symbol-file $uboot_symfile $1
使用方式
启动交叉编译GDB时,通过-x加载脚本并传递参数:
# 完整参数:U-Boot路径 + 远程IP + 端口 x-compiler-gdb -x uboot_debug.gdb ./build/tmp/deploy/images/board/u-boot 192.168.1.50 3333 # 仅传U-Boot路径,使用默认localhost:3333 x-compiler-gdb -x uboot_debug.gdb ./build/tmp/deploy/images/board/u-boot
核心要点
- 利用GDB内置的
$argc(参数数量)、$arg0/$arg1(参数值)接收外部输入 - 预设默认值保证脚本在参数不全时仍能运行
- 用
$uboot_symfile变量保存初始传入的符号文件路径,后续重加载直接复用 - 重定位地址的符号需根据目标平台调整,可通过
nm path/to/u-boot | grep relocation类命令确认具体符号
内容的提问来源于stack exchange,提问作者code_fodder
相关产品推荐
相关产品推荐

