You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载符号文件后GDB查看特定地址触发Segmentation fault故障排查

问题分析与解决

环境信息

  • Linux My-PC 5.15.90.1-microsoft-standard-WSL2 x86_64 x86_64 x86_64 GNU/Linux
  • 发行版ID:Ubuntu
  • 版本描述:Ubuntu 22.04.1 LTS

GDB版本

$ gdb-multiarch -v
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1

编译配置(Makefile节选)

AS  =arm-linux-gnueabihf-as
LD  =arm-linux-gnueabihf-ld
NM  =arm-linux-gnueabihf-nm
LDFLAGS =-Timx6ul.lds 
CC  =arm-linux-gnueabihf-gcc  $(RAMDISK)
CFLAGS  =-Wall -fomit-frame-pointer -nostdlib -fno-stack-protector -g

CPP =arm-linux-gnueabihf-cpp -nostdinc -Iinclude -lgcc -L/usr/lib/gcc-cross/arm-linux-gnueabihf/11 -g

.c.s:
    $(CC) $(CFLAGS) \
    -nostdinc -Iinclude -S -o $*.s $<
.s.o:
    $(AS)  -o $*.o $<
.c.o:
    $(CC) $(CFLAGS) \
    -nostdinc -Iinclude -c -o $*.o $<

all:    Image

Image: boot/start tools/system
    arm-linux-gnueabihf-objcopy -O binary -R .note -R .comment tools/system Image
    sync

tools/system:    init/main.o boot/start.o \
    $(ARCHIVES) $(DRIVERS) $(MATH) $(LIBS) 
    mkdir -p tools
    $(LD) $(LDFLAGS) init/main.o boot/start.o \
    $(ARCHIVES) \
    $(DRIVERS) \
    $(MATH) \
    $(LIBS) \
    -o tools/system -lgcc -L /usr/lib/gcc-cross/arm-linux-gnueabihf/11 
    $(NM) -n tools/system > System.map

boot/start:boot/start.S
    $(AS) -o boot/start.o boot/start.S

qemu: all
    qemu-system-arm \
        -machine virt,gic-version=3 \
        -m 4G \
        -cpu cortex-a7 \
        -nographic \
        -device loader,file=Image,addr=0xC0008000,cpu-num=0 \
        -s -S 
        # -serial null -serial mon:stdio \

GDB初始化脚本(init.gdb)

target remote localhost:1234
set architecture arm
symbol-file tools/system
x/i 0xc0010f68

问题现象

加载符号文件后,用GDB查看地址0xc0010f68时直接触发Segmentation fault导致GDB崩溃,但相邻的0xc0010f64和0xc0010f6c地址可正常访问;不加载符号文件时,GDB运行完全正常。错误日志如下:

Fatal signal: Segmentation fault
----- Backtrace -----
0x55e79b1e4197 ???
0x55e79b2e6599 ???
0x55e79b2e6762 ???
0x7f66f400951f ???
        ./signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0
0x55e79b64560c ???
0x55e79b6452c5 ???
0x55e79b646831 ???
0x55e79b6469c9 ???
0x55e79b2761b1 ???
0x55e79b27718b ???
0x55e79b4437d7 ???
0x55e79b447f4b ???
0x55e79b448a0c ???
0x55e79b219774 ???
0x55e79b5a9d94 ???
0x55e79b2e76e4 ???
0x55e79b5ab99e ???
0x55e79b228443 ???
0x55e79b2163b7 ???
0x55e79b3b1da5 ???
0x55e79b3b1e39 ???
0x55e79b3b38d3 ???
0x55e79b3b43fe ???
0x55e79b10e0ef ???
0x7f66f3ff0d8f __libc_start_call_main
        ../sysdeps/nptl/libc_start_call_main.h:58
0x7f66f3ff0e3f __libc_start_main_impl
        ../csu/libc-start.c:392
0x55e79b113e24 ???
0xffffffffffffffff ???
---------------------A fatal error internal to GDB has been detected, furtherdebugging is not possible.  GDB will now terminate.

原因分析

  1. 符号表地址映射异常:加载tools/system后,GDB会关联符号与目标内存地址。如果0xc0010f68对应的符号存在损坏、或在符号表中被标记为无效内存区域,GDB解析时会错误访问本地(WSL2主机)的无效内存,直接崩溃。
  2. GDB版本兼容性bug:GDB 12.1在处理ARM交叉调试符号时,对自定义链接脚本(imx6ul.lds)生成的可执行文件可能存在解析逻辑异常,这是该版本已知的稳定性问题之一。
  3. 编译/链接参数导致符号表不完整:-nostdlib、-fomit-frame-pointer等参数可能让符号表生成不规范,地址计算出现偏差,导致GDB加载后无法正确识别目标内存的有效性。

解决办法

方法1:修复符号文件有效性

  • 重新全量编译,确保过程无警告或错误:
    make clean && make all V=1
    
  • 检查System.map中0xc0010f68的条目,确认符号是否正常:
    grep 0xc0010f68 System.map
    
    如果该地址无对应符号或标记异常,需检查链接脚本imx6ul.lds中该地址所属段的权限(可读、可执行)配置是否正确。

方法2:更换GDB版本

  • 降级到GDB 11.x版本(ARM交叉调试稳定性更好):
    sudo apt remove gdb-multiarch
    sudo apt install gdb-multiarch=11.1-0ubuntu1~22.04
    
  • 或升级到最新版本修复已知bug:
    sudo add-apt-repository ppa:ubuntu-toolchain-r/test
    sudo apt update
    sudo apt install gdb-multiarch
    

方法3:规避符号解析问题

  • 用add-symbol-file替代symbol-file,指定符号加载的内存偏移(与QEMU加载地址一致):
    target remote localhost:1234
    set architecture arm
    add-symbol-file tools/system 0xC0008000
    x/i 0xc0010f68
    
  • 查看该地址时临时禁用符号解析:
    set print symbol off
    x/i 0xc0010f68
    set print symbol on
    

方法4:核对QEMU与编译配置一致性

  • 确认QEMU加载地址0xC0008000与链接脚本imx6ul.lds的入口地址完全一致,避免符号地址与实际运行地址偏移错误。
  • 用readelf检查符号表有效性:
    arm-linux-gnueabihf-readelf -s tools/system | grep 0xc0010f68
    

内容的提问来源于stack exchange,提问作者Haoson Q

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:57:33