Simics 2021.24 异机编译目标程序设置断点无法触发问题
Simics下外部编译程序main断点不触发的原因及解决方案
问题原因
- PIE编译导致地址不匹配:Ubuntu 20.04 默认gcc编译开启了*位置无关可执行文件(PIE)*特性,生成的
a.out无固定加载基地址,运行时会被随机映射到虚拟地址空间。直接执行add-symbol-file a.out时,Simics会用二进制内置的段偏移作为绝对虚拟地址计算断点位置,和实际运行时的加载地址完全不匹配,断点设置到了无效地址,因此无法触发。而QSP-x86环境内的gcc默认通常关闭PIE,生成的二进制地址固定,符号地址与运行时地址一致,断点可以正常命中。 - 未绑定用户进程调试上下文:Simics默认调试上下文是全局的,未区分内核地址空间和特定用户进程的地址空间,若没有绑定
a.out对应的进程上下文,即使地址正确,也可能因为地址空间切换无法命中断点。
解决方案
方案1:编译时关闭PIE(最简方案)
编译程序时添加禁用PIE的参数,生成固定加载地址的二进制:
gcc -g -no-pie -fno-pie a.c
之后按原有步骤操作即可正常命中main函数断点。
方案2:动态匹配程序加载地址(无需修改编译参数)
如果需要调试PIE二进制,可通过进程跟踪功能在程序启动后再加载符号下断点:
- 开启Simics软件跟踪功能,设置程序启动断点:
simics> enable-debugger simics> enable-software-tracker simics> bp.process.start -binary a.out simics> run
- 模拟控制台中运行
a.out,Simics会在程序启动时自动暂停,此时加载符号并下断点:
simics> add-symbol-file a.out simics> bp.source_location.break main simics> continue
内容的提问来源于stack exchange,提问作者YKG
相关产品推荐
相关产品推荐

