iOS 运行时符号化主要通过 dladdr() 函数实现,可以将内存地址转换为可读的符号信息,包括 image 镜像基址、image 镜像路径、符号地址和符号名称。在符号化之前需要进行地址调整,因为堆栈上存储的是返回地址而非调用指令地址,需要对返回地址减 1 得到实际的调用指令地址。以 ARM64 为例,调整公式为 (return_address &~ 3UL) - 1。dladdr 解析成功后还需要计算偏移量得到最终的符号化结果。运行时符号化的主要局限是只能获取公开符号(导出符号),无法获取文件名和行号等详细信息。要获取完整的符号化信息(包括文件名和行号),需要使用 dSYM 文件进行离线符号化,这通常在服务端完成。
加载中...