针对你使用SCons构建STM32F103项目后ELF文件无法调试的问题,这里提供系统化的解决方案:
-g选项)在SConscript中强制开启调试选项:
env.Append(CCFLAGS=['-g', '-Og']) # 必须包含 -g
env.Append(LINKFLAGS=['-g']) # 链接阶段保留调试符号检查startup_stm32f10x_hd.s是否正确配置:
.section .isr_vector,"a",%progbits ; 确保向量表段名称正确
.long __main ; 检查入口点
.long Reset_Handler ; 必须是程序第一跳转地址stm32f103ze.ld)添加调试信息保留段:
/* 在.text段后添加 */
.debug_info 0 : { *(.debug_info) }
.debug_line 0 : { *(.debug_line) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_frame 0 : { *(.debug_frame) }完整示例:
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)使用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)
执行检查:
arm-none-eabi-readelf -S build/demo.elf | grep debug
# 应输出.debug_info/.debug_line等段
arm-none-eabi-objdump -d build/demo.elf | grep ''
# 确认入口点存在 启动文件入口验证:
Reset_Handler:
ldr sp, =_estack ; 堆栈必须正确初始化
bl SystemInit ; 时钟初始化
bl __main ; C库入口生成映射文件(在SCons中添加):
env.Append(LINKFLAGS=['-Wl,-Map=build/demo.map'])检查.map文件中.isr_vector的地址是否为0x08000000
| 现象 | 检查点 |
|---|---|
| 无源码 | 检查-g是否开启 |
| 变量不可见 | 优化等级-O0或-Og |
| PC指针不在代码区 | 启动文件/中断向量表 |
| 无寄存器信息 | 调试器复位时序问题 |
| 无法设断点 | ELF文件是否最新编译 |
建议:
scons -cscons --debug=explain(显示详细过程)按照以上步骤可解决95%的STM32调试问题。若仍有问题,请提供以下关键信息:
arm-none-eabi-gcc -v 输出
举报
更多回帖