如何通过Android崩溃日志的偏移量定位ASM对应的源码行号
通过符号偏移定位汇编源码行的方法
前置准备
你需要先拿到和崩溃日志中BuildId 1980ba02db10292648c1fc24639ec9c1完全匹配的libc.so带符号版本,或者直接拉取对应Android 10分支的bionic源码本地编译,编译时开启调试信息保留选项,避免版本差异导致偏移不匹配。
具体操作步骤
- 确认偏移属性:Crashlytics输出的
__memcpy_a53+40中,后缀的数值为十进制字节偏移,代表崩溃点位于__memcpy_a53函数入口之后的第40个字节位置,转换为十六进制为0x28。 - 编译汇编文件生成映射关系:使用对应Android 10版本的ARM32编译工具链(如NDK内置的arm-linux-androideabi-as),加
-g参数保留调试信息,编译你获取到的bionic/libc/arch-arm/cortex-a53/bionic/memcpy.S文件,生成带行号映射的.o目标文件。 - 查看偏移对应行号:执行
objdump -dS 编译生成的目标文件.o命令,输出结果会同时展示汇编指令、机器码、相对函数入口的偏移、对应源码行号四类信息,直接查找偏移为0x28的条目即可得到崩溃对应的源码行。
快速校验方法
Cortex-A53架构的memcpy默认使用ARM32模式编译,每条指令固定占4字节,你可以从__memcpy_a53函数的入口指令开始,逐行数10条指令(40/4=10),即可快速定位到崩溃的大致指令位置,该方法仅用于快速校验,最终结果以objdump输出为准。
内容的提问来源于stack exchange,提问作者Programmer1234
相关产品推荐
相关产品推荐

