RT-Thread论坛
直播中

李春梅

8年用户 1981经验值
私信 关注
[问答]

用scons构建了stm32f103的简单demo ,代码正常运行,但是elf无法调试,怎么解决?

我用scons 简单的构建了STM32 的编译Demo,编程成功了,导入elf 调试,看不到任何东西。兄弟吗?有知道怎么排查的吗?  我把DEMO 放入附件了,看看有没有大神能搞定,教教我


回帖(1)

张虎豹

2025-9-15 17:48:56

针对你使用SCons构建STM32F103项目后ELF文件无法调试的问题,这里提供系统化的解决方案:


核心原因分析



  1. 调试符号缺失:编译器未生成调试信息(GCC的-g选项)

  2. 调试配置错误:调试器连接/加载方式不正确

  3. 启动文件问题:中断向量表未正确初始化或入口点错误

  4. SCons构建配置缺陷:链接脚本、优化等级或依赖缺失




解决方案


1️⃣ 添加调试符号(关键步骤)


在SConscript中强制开启调试选项:


env.Append(CCFLAGS=['-g', '-Og'])  # 必须包含 -g
env.Append(LINKFLAGS=['-g'])       # 链接阶段保留调试符号

2️⃣ 确认启动文件配置


检查startup_stm32f10x_hd.s是否正确配置:


.section  .isr_vector,"a",%progbits  ; 确保向量表段名称正确
.long  __main                       ; 检查入口点
.long  Reset_Handler                ; 必须是程序第一跳转地址

3️⃣ 修正链接脚本(stm32f103ze.ld)


添加调试信息保留段:


/* 在.text段后添加 */
.debug_info     0 : { *(.debug_info) }
.debug_line     0 : { *(.debug_line) }
.debug_abbrev   0 : { *(.debug_abbrev) }
.debug_frame    0 : { *(.debug_frame) }

4️⃣ 优化SCons构建配置


完整示例:


env = Environment(tools=['gcc', 'gnulink'])
env.Replace(
    CC="arm-none-eabi-gcc",
    OBJCOPY="arm-none-eabi-objcopy",
    BUILD_DIR="build"
)

env.Append(
    CCFLAGS=[
        '-mcpu=cortex-m3',
        '-mthumb',
        '-g',                    # 调试关键
        '-Og',                   # 优化级别
        '-DSTM32F10X_HD',
        '-IInc'
    ],
    LINKFLAGS=[
        '-T${SOURCE.dir}/stm32f103ze.ld',
        '-specs=nosys.specs',
        '-g'                    # 保留链接符号
    ]
)
sources = Glob("Src/*.c") + ["startup_stm32f10x_hd.s"]
env.Program("build/demo.elf", sources)

5️⃣ 调试器配置技巧(GDB)


使用OpenOCD调试时执行:


arm-none-eabi-gdb build/demo.elf -ex "target extended-remote :3333" 
-ex "monitor reset halt"
-ex "load"
-ex "b main"
-ex "c"


重要:务必在加载后触发硬件复位(monitor reset halt)



6️⃣ 验证ELF调试信息


执行检查:


arm-none-eabi-readelf -S build/demo.elf | grep debug
# 应输出.debug_info/.debug_line等段
arm-none-eabi-objdump -d build/demo.elf | grep ''
# 确认入口点存在

7️⃣ 关键排查步骤




  1. 启动文件入口验证


    Reset_Handler:  
       ldr   sp, =_estack       ; 堆栈必须正确初始化
       bl    SystemInit         ; 时钟初始化
       bl    __main             ; C库入口



  2. 生成映射文件(在SCons中添加):


    env.Append(LINKFLAGS=['-Wl,-Map=build/demo.map'])

    检查.map文件中.isr_vector的地址是否为0x08000000






调试失败快速自检表































现象 检查点
无源码 检查-g是否开启
变量不可见 优化等级-O0-Og
PC指针不在代码区 启动文件/中断向量表
无寄存器信息 调试器复位时序问题
无法设断点 ELF文件是否最新编译

建议:



  1. 完整清理项目:scons -c

  2. 重新编译:scons --debug=explain(显示详细过程)

  3. 使用GDB直接加载而非IDE集成调试(减少干扰)


按照以上步骤可解决95%的STM32调试问题。若仍有问题,请提供以下关键信息:



  • arm-none-eabi-gcc -v 输出

  • OpenOCD/GDB的完整调试日志

  • 编译时控制台输出(特别是warning)

  • 启动文件和链接脚本内容节选

举报

更多回帖

发帖
×
20
完善资料,
赚取积分