iOS-详解没有dSYM文件 如何解析iOS崩溃日志

article/2025/1/11 7:46:06

Xcode支持崩溃日志自动符号化,前提是本地有当时Build/Archive生成的dSYM文件,iOS崩溃日志符号化后,可以帮助开发者更好的定位问题,但如果dSYM文件丢失或拿到的崩溃日志不是标准的crash log,如何定位crash呢,笔者结过尝试发现一样可以定位到具体函数。

  在无dSYM文件情况下,之所以无法解析出崩溃地址对应的函数名,是因为Xcode在导出ipa时会去除Symbol Table(符号表)的非系统符号部分。这时address无法对应函数名,所以无法确定是在哪个函数或block中出了问题。因此解析日志的关键是要恢复符号表,国内已有大神做过研究 杨君的小黑屋,本文基于此完成解析目标。

我们以测试程序CrashTest的崩溃为例,介绍一下具体解析步骤

如图,

 

 

我们拿到了崩溃日志,这是一个arm64架构的崩溃日志,从最后的backtrace我们知道程序在访问数组元素时异常终止,但由于本地没有对应的dSYM文件,Xcode没有将红框内3,4两行符号化为具体的函数名,本文的工作就是要将这2行符号化

开始之前,先解释一下这几行地址的含义

:左边这一列是崩溃时的调用栈地址(虚拟内存地址)

基址:基址指向的地址是CrashTest这个模块加载到内存中的起始地址

偏移:左边栈地址 = 基址 + 偏移 (注意是10进制的)

 

什么?你拿到的崩溃日志不是这样的! (老司机请绕过)

像这样,只有一堆地址

复制代码
Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Triggered by Thread:  0Last Exception Backtrace:
(0x186e9de48 0x1975dc0e4 0x186d83a54 0x10000c00c 0x10000bf7c 0x18b6810f8 0x18b66a22c 0x18b680a94 0x18b680720 0x18b679c74 0x18b64d38c 0x18b8ec1b4 0x18b64b8f4 0x186e560e8 0x186e5538c 0x186e5343c 0x186d811f4 0x18ff0f5a4 0x18b6b2784 0x10000c574 0x197c4aa08)Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib            0x0000000197d63270 0x197d48000 + 111216
1   libsystem_pthread.dylib           0x0000000197e01224 0x197dfc000 + 21028
2   libsystem_c.dylib                 0x0000000197cdab14 0x197c78000 + 404244
3   libc++abi.dylib                   0x0000000196dad414 0x196dac000 + 5140
4   libc++abi.dylib                   0x0000000196dccb88 0x196dac000 + 134024
5   libobjc.A.dylib                   0x00000001975dc3bc 0x1975d4000 + 33724
6   libc++abi.dylib                   0x0000000196dc9bb0 0x196dac000 + 121776
7   libc++abi.dylib                   0x0000000196dc9738 0x196dac000 + 120632
8   libobjc.A.dylib                   0x00000001975dc290 0x1975d4000 + 33424
9   CoreFoundation                    0x0000000186d812a0 0x186d78000 + 37536
10  GraphicsServices                  0x000000018ff0f5a0 0x18ff04000 + 46496
11  UIKit                             0x000000018b6b2780 0x18b63c000 + 485248
12  CrashTest                         0x000000010000c570 0x100004000 + 34160
13  libdyld.dylib                     0x0000000197c4aa04 0x197c48000 + 10756
复制代码

 没有关系,其实和上面是一样的,我们来找找基址和偏移

往下找到 Binary Images段,这里显示的就是崩溃程序当时加载的所有库的快照

复制代码
Binary Images:
0x100004000 - 0x10000ffff CrashTest arm64  <5fc8820b297631d087e5e665b261ed0c> /var/mobile/Containers/Bundle/Application/D8F09771-5B65-4403-A19C-CE77DAF32623/CrashTest.app/CrashTest // 这里第一行便是我们要找的
0x120070000 - 0x120097fff dyld arm64  <f958ba064181388a9658f927da42e9e7> /usr/lib/dyld
0x185678000 - 0x18580bfff AVFoundation arm64  <0c542593e3613f82b7e860cb5beeeed6> /System/Library/Frameworks/AVFoundation.framework/AVFoundation
0x18580c000 - 0x185870fff libAVFAudio.dylib arm64  <c9d296cb28c73570aaf8355b05f1adee> /System/Library/Frameworks/AVFoundation.framework/libAVFAudio.dylib
0x1858b4000 - 0x1858b4fff Accelerate arm64  <e9ba7838f51634a7b59ed392be50e86f> /System/Library/Frameworks/Accelerate.framework/Accelerate
0x1858cc000 - 0x185aebfff vImage arm64  <da44067fc79931c7aef1b7e88bf82a83> /System/Library/Frameworks/Accelerate.framework/Frameworks/vImage.framework/vImage
0x185aec000 - 0x185b93fff libBLAS.dylib arm64  <e5276e7784ef34a4baca480264978ea0> /System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libBLAS.dylib
复制代码

 然后找到我们的应用 CrashTest

0x100004000 - 0x10000ffff CrashTest arm64  <5fc8820b297631d087e5e665b261ed0c> /var/mobile/Containers/Bundle/Application/D8F09771-5B65-4403-A19C-CE77DAF32623/CrashTest.app/CrashTest

 我们看到行首有个地址区间 0x100004000 - 0x10000ffff , 这便是崩溃程序的内存区,起始地址(基址)为 0x100004000,OK基址找到了。

然后我们再看看崩溃时的栈

Last Exception Backtrace:
(0x186e9de48 0x1975dc0e4 0x186d83a54 0x10000c00c 0x10000bf7c 0x18b6810f8 0x18b66a22c 0x18b680a94 0x18b680720 0x18b679c74 0x18b64d38c 0x18b8ec1b4 0x18b64b8f4 0x186e560e8 0x186e5538c 0x186e5343c 0x186d811f4 0x18ff0f5a4 0x18b6b2784 0x10000c574 0x197c4aa08)

 其中位于地址区间 0x100004000 - 0x10000ffff 的,有2个 0x10000c00c 0x10000bf7c,这就是崩溃程序的调用栈,其余地址为系统库函数调用栈。

 

OK开始动手

1. 下载符号恢复工具

修改权限

chmod a+x restore-symbol 

 

2. 恢复符号

我们拿到的崩溃日志来自arm64机器,所以先将二进制文件 CrashTest.app/CrashTest 瘦身 (必须正确选择目标CPU架构类型,否则解析出来也是错的)

lipo -thin arm64 CrashTest -output CrashTest-arm64

 接着用工具恢复符号表

./restore-symbol -o CrashTest-symbol CrashTest-arm64

 现在我们得到了一个恢复了符号表的二时制文件 CrashTest-symbol

3. 使用苹果自带命令行工具atos,将崩溃地址解析成具体函数

atos -arch arm64 -o CrashTest-symbol -l 0x100030000 0x100034340 0x1000342b0
# 简单解释一下这个命令,atos -arch CPU架构 -o 进制文件 -l 起始地址 ...一系列内存地址
# -l 后面跟的是模块的起始地址,再后面可以罗列很多地址,该命令会依次解析出具体函数

得到如下输出

-[ViewController getChild:] (in CrashTest-symbol) + 64
-[ViewController crashOnFunc:] (in CrashTest-symbol) + 44

至此,完成了解析。

本篇涉及的崩溃是普通函数中的崩溃,如果崩溃发生在block中,则需要借住反编译工具,请参考 恢复二进制文件中的block符号表

 PS:再多说一点,上面的解析输出我们看到在函数后面有一个 + 64, 这个+ 64、+ 44是什么意思呢,我开始也不太明白,仔细观察Hopper/IDA解析出来的的汇编代码,才明白原来这也是个偏移,是指调用地址相对于函数的起始地址的偏移,并非.m文件中的代码行数。

附件:

本篇使用的DEMO

参考 & 感谢

  杨君的小黑屋 http://blog.imjun.net/posts/restore-symbol-of-iOS-app/

  


http://chatgpt.dhexx.cn/article/YLyahuQW.shtml

相关文章

iOS开发-dSYM文件

文章目录 dSYMxcode的符号化解析每个架构的符号 Bitcode相关定位你的dSYMBuild UUID对比恢复隐藏的符号表文件符号化解析操作命令命令行工具 symbolicatecrash 符号化 dSYM 根据 苹果官方文档&#xff0c;当编译器将源代码转为机械码时&#xff0c;会生成调试符号(debug symbo…

ios崩溃日志分析,无dSYM文件

问题场景 大部分情况下&#xff0c;我们都拿不到dSYM文件&#xff0c;只有一份ipa文件一个crash文件&#xff0c;应该如何定位具体崩溃的代码呢&#xff1f; 实例说明 首先本人建立了一个demo工程&#xff0c;写了一段会crash的代码&#xff0c;如下图 然后打包成ipa包&…

命令行工具解析Crash文件,dSYM文件进行符号化

https://www.jishux.com/p/10628644fe5dabf3 序 在日常开发中&#xff0c;app难免会发生崩溃。简单的崩溃还好说&#xff0c;复杂的崩溃就需要我们通过解析Crash文件来分析了&#xff0c;解析Crash文件在iOS开发中是比较常见的。 获取崩溃信息方式 在iOS中获取崩溃信息的方…

iOS-dSYM 文件分析工具

来到新公司后&#xff0c;前段时间就一直在忙&#xff0c;前不久 项目 终于成功发布上线了&#xff0c;最近就在给项目做优化&#xff0c;并排除一些线上软件的 bug&#xff0c;因为项目中使用了友盟统计&#xff0c;所以在友盟给出的错误信息统计中能比较方便的找出客户端异常…

DSYM文件

什么是dSYM文件&#xff1f; iOS平台中&#xff0c;dSYM文件是指具有调试信息的目标文件&#xff0c;文件名通常为&#xff1a;xxx.app.dSYM。如下图所示&#xff1a; 为了方便找回Crash对应的dSYM文件和还原堆栈&#xff0c;建议每次构建或者发布APP版本的时候&#xff0c;备…

Xcode打包后,找不到dSYM文件

在一次分析crash时&#xff0c;需要用到dSYM文件&#xff0c;于是去对应的位置找&#xff0c;结果找到一个空文件夹&#xff0c;里面什么都没有&#xff0c;这是怎么回事&#xff1f; 后来发现是在打包的时候&#xff0c;在TARGET->Building Setting->Build Option下的设…

dSYM文件是什么 ?

Overview 概述 dSYM的全称是debug symbol, 所以dSYM文件就是debug symbol (dSYM) file, dSYM文件中的每个 debug symbol, 对应了一个关系, 这个关系一端是源代码里真实的符号(类名称、全局变量以及方法和函数名称), 另一端则是其定义的文件号和行号. Apple Documentation 苹果…

通过dSYM文件分析crash日志

一、获取crash日志 1、连接崩溃手机&#xff0c;同步 2、日志保存位置&#xff1a; ~/Library/Logs/CrashReporter/MobileDevice/ 3、找到对应的手机和对应的crash文件 二、获取dsym文件 1、 XCode -> Window -> Organizer -> Archiver 找到对应的打包项目&#xf…

手动解析App dSYM示例

https://www.jianshu.com/p/c507f95646bd 前期准备 崩溃日志地址(涉及敏感数据已屏蔽)对应app 的 dSYM文件&#xff0c;利用dwarfdump --uuid <file_to_detect>检测dSYM文件uuid和app执行文件uuid是否匹配 $ dwarfdump --uuid APP_BUNDLE_NAME.app.dSYMUUID: F181E27B…

dSYM介绍

在XCODE编译项目之后,会在app旁看见一个同名的dSYM文件. 他是一个编译的中转文件,简单说就是debug的symbols包含在这个文件中. 他有什么作用? 当release的版本 crash的时候,会有一个日志文件,包含出错的内存地址,使用symbolicatecrash工具能够把日志和dSYM文件转换成可以阅读的…

dSYM文件分析

dSYM 文件 什么是 dSYM 文件 Xcode编译项目后&#xff0c;我们会看到一个同名的 dSYM 文件&#xff0c;dSYM 是保存 16 进制函数地址映射信息的中转文件&#xff0c;我们调试的 symbols 都会包含在这个文件中&#xff0c; 并且每次编译项目的时候都会生成一个新的 dSYM 文件&am…

iOS dSYM详解和分析crash,ips文件

1.什么是dSYM文件 dSYM 文件是Xcode编译后&#xff0c;我们会看到一个同名的 dSYM 文件&#xff0c;dSYM 是保存 16 进制函数地址映射信息的中转文件&#xff0c;存储应用程序的调试 symbols。每次编译项目或者打包的时候都会生成一个新的 dSYM 文件&#xff0c;当我们软件rel…

Xcode骚操作之:解决报错 MapFileParser.sh: Permission denied

MapFileParser.sh: Permission denied Unity项目&#xff0c;需要用Xcode运行&#xff0c;结果报了错误。 解决方案&#xff1a; 1、启动台》其它》选择 终端 &#xff0c;输入以下命令&#xff1a; chmod空格x空格拖拽这个文件到小黑框 回车 注意&#xff1a;chmod x的意思…

ipa重签名的四种方式

文章为学习hank的视频笔记 一 开发者调试安装app到手机的签名过程 1. Mac电脑生成公钥M和私钥M 2. 公钥M传给苹果服务器,苹果服务器的私钥A对公钥M进行加密生成证书返回给xcode 3. Xcode下载profile等描述文件,用公钥M对app进行加密生成app签名,然后把app签名和证书以及p…

闲聊扯淡 | 微信8.0背景视频合集,笑死我了

微信 8.0 更新已经有几天了&#xff0c;最开始现在 IOS 端推行&#xff0c;昨天在安卓端也可以更新了&#xff0c;没有更新的小可爱快去更新试试吧。 除了重新高清化的表情以及衍生的表情包大战外&#xff0c;各种新玩法也被不断挖掘出来。 值得一提的就是微信 8.0 中是支持视频…

Unity简单操作:获取 apk在 苹果平台 或者 安卓平台,它自身的包名

在运行时返回应用程序标识。在 Apple 平台上为保存在 info.plist 文件中的“bundleIdentifier”&#xff0c;在 Android 平台上为 AndroidManifest.xml 中的“package”。(com.xxxx.xxxx)

iOS 多线程和GCD(Grand Central Dispath) 教程 (一)

iOS 多线程和GCD(Grand Central Dispath) 教程 &#xff08;一&#xff09; 本文翻译自 Ray Wenderlich 的博客 点击打开原文链接。全部由本人亲手翻译...童叟无欺~ 你有木有遇见过这样的情况&#xff0c;当你在写app的时候&#xff0c;有时候界面就卡住了&#xff0c;要等很长…

iOS【开发热门游戏_超级猜图Demo】

先看效果图 思路 需求分析 1&#xff0c;搭建界面 1》上半部分&#xff0c;固定的&#xff0c;用Storyboard直接连线(OK) 2》下半部分&#xff0c;根据题目的变化&#xff0c;不断变化和调整&#xff0c;用代码方式实现比较合适(OK) *备选按钮区域(OK) *答案按钮区域(OK)…

unity骚操作之: 解决AVPro Video在安卓移动端播放不了SteramAssecting里面的视频 或者 URL视频

Unity自带VideoPlay用来播放视频有bug,在移动端测试无法正常使用Url播放,所以找到AVProVideo,这个插件很好用,移动端亲测可用,功能也全,这里记录下使用心得 下载地址:支持Unity2019及以上版本AVProVideo1.11.5视频播放插件.zip_avpro安卓11不能播放-C#文档类资源-CSDN下…

unity普通操作:animator播放,暂停,判断播放完成【(增加1个判断如果这个是动画融合的情况)】

1.播放&#xff0c;暂停 anim.CrossFade("s2", 0); anim.speed0&#xff1b;//暂停 anim.speed1&#xff1b;//播放 判断播放完成&#xff08;Update方式&#xff09; void Update(){AnimatorStateInfo stateinfo2 anim.GetCurrentAnimatorStateInfo(0);//判断…