iOS Crash 分析(文一)- 开始

本文介绍了iOS应用崩溃分析的基础知识,包括UUID、dwarfdump、symbolicatecrash和atosl等名词解释,以及如何获取模拟器和真机的Crash日志。详细阐述了通过Xcode和手动方式获取真机日志的方法,并讨论了使用Xcode和symbolicatecrash脚本进行符号化的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS Crash 分析(文一)- 开始


1. 名词解释

1. UUID

一个字符串,在iOS上每个可执行文件或库文件都包含至少一个UUID。目的是为了唯一识别这个文件。

2. dwarfdump

苹果提供的命令行工具,其中一些功能就是查看可执行文件件或库文件的UUID

3. symbolicatecrash

一个苹果提供的脚本。可以将crash日志符号化为可读的堆栈信息。

4. atosl

苹果提供的命令行工具,可以将crash的base_address和load_address转化为可读的堆栈信息。symbolicatecrash就是使用这个命令来做符号化的。

2.如何获取Crash日志

1.模拟器崩溃

模拟器崩溃后可以在“~/Library/Logs/DiagnosticReports/”下找到crash日志。

2.真机崩溃

1.Xcode获取日志

手机和mac连接后,打开Xcode选择window进入Organizer(快捷方式是 Shift-CMD-2),在 Organizer 窗口上, 选中 Devices 标签栏. 在左侧的导航面板上,选中 Device Logs, 如下图所示:

选择对应设备的Device Logs菜单,就可以看到崩溃日志。
打开图最上边的Device Logs菜单就可以看到mac曾经同步过的iOS设备的崩溃日志。

2.手动获取日志

日志存放的路径 ~/Library/Logs/CrashReporter/MobileDevice/DEVICE_NAME

DEVICE_NAME是你想要查看的设备。
下面是我的终端输出的信息:

➜  DiagnosticReports  pwd
/Users/zhuolaiqiang/Library/Logs/DiagnosticReports
➜  DiagnosticReports  ls
QQ_2014-05-30-132026_Anyhacker.crash            atosl_2014-06-04-151416_Anyhacker.crash         eclipse_2014-05-29-192522_Anyhacker.crash       eclipse_2014-06-02-145714_Anyhacker.crash
SogouInput_2014-05-29-151154_Anyhacker.crash    atosl_2014-06-04-151447_Anyhacker.crash         

3.符号化

1.利用Xcode符号化

app在真机设备上Crash后,我们可以让iOS设备和mac连接,然后打开Xcode选择window进入Organizer(快捷方式是 Shift-CMD-2),在 Organizer 窗口上, 选中对应设备的 Device Logs标签,然后找到对应app日志文件,如图所示:

这样就可以看到已经符号化完毕的日志。

2.利用symbolicatecrash脚本符号化

symbolicatecrash是苹果随Xcode一起提供的专门用来做崩溃日志符号化的脚本工具(perl)。
symbolicatecrash存放路径是
"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash"。

使用方法是:
symbolicatecrash xx.crash xx.DSYM
xx.crash:需要符号化的崩溃日志文件
xx.DSYM:编译APP时产生的DSYM文件,此文件可以不指定,symbolicatecrash会在硬盘内自动搜索和匹配该文件(前提是你的硬盘内存有这个文件)

<think>首先,用户的问题是关于在Mac上手动解析iOS崩溃日志后如何输出结果。崩溃日志通常来自iOS设备,当应用崩溃时生成。 用户提到“手动解析”,意思是用户可能已经获取了崩溃日志文件,现在需要处理它来获取有用的信息,比如符号化(symbolication),以将内存地址映射回源代码行。 关键步骤: 1. **获取崩溃日志**:崩溃日志可以从设备、Xcode或iTunes Connect获取。但用户说“手动解析”,所以可能用户已经有了日志文件(如.crash文件)。 2. **符号化**:崩溃日志包含十六进制地址,这些地址需要符号化才能转换为可读的函数名和行号。这需要对应的.dSYM文件(调试符号文件)。 3. **工具**:在Mac上,常用的工具是Xcode的命令行工具,如symbolicatecrash脚本或atos命令。 输出结果:解析后,输出应该是一个更易读的崩溃报告,显示崩溃原因、调用栈等。 步骤概述: - **准备工具**:确保Xcode安装,并设置PATH。 - **符号化**:使用symbolicatecrash脚本或atos命令。 - **输出**:解析后的日志可以输出到终端或保存到文件。 参考引用: - 引用[1]提到“符号化(symbolication),从日志追踪到代码”。 - 引用[2]提到iOS崩溃日志收集,但内容不直接相关。 用户的具体需求:用户想知道“手动解析iOS崩溃日志后如何输出结果”。所以,我需要解释如何执行解析和输出。 结构化回答: 1. **介绍**:简要解释崩溃日志解析的目的。 2. **步骤**:详细步骤如何手动解析和输出。 3. **输出示例**:提供一个简单的输出示例。 4. **相关问题**:根据系统指令生成相关问题。 系统指令: - 使用$...$和$$...$$格式。 - 使用中文回答。 - 生成相关问题。 - 回答结构清晰。 完整回答结构: - 解释过程。 - 步骤指南。 - 输出如何查看。 - 相关问题。 确保真实可靠:基于iOS开发知识。</think>### 手动解析 iOS 崩溃日志后输出结果的方法 在 Mac 上手动解析 iOS 崩溃日志(通常为 `.crash` 文件)后,输出结果的关键步骤是进行**符号化(symbolication)**。符号化将日志中的内存地址转换为可读的函数名、源代码文件名和行号,帮助你定位崩溃原因。这需要准备崩溃日志文件、对应的 `.dSYM` 文件(调试符号文件)和 Xcode 工具。以下是详细步骤,基于标准 iOS 开发实践,确保过程可靠。 #### 步骤 1: 准备工作 - **获取必要文件**: - **崩溃日志文件**(如 `app.crash`):可以从设备、Xcode(通过 Window > Devices and Simulators > View Device Logs)或 iTunes Connect 导出。 - **.dSYM 文件**:这是应用编译时生成的调试符号文件,位于 Xcode 项目的 `DerivedData` 目录下(路径类似 `~/Library/Developer/Xcode/DerivedData/YourApp-<hash>/Build/Products/Release-iphoneos/`)。确保使用与崩溃日志匹配的版本(通过 UUID 验证)。 - **验证 UUID 匹配**:使用终端命令检查崩溃日志和 .dSYM 文件的 UUID 是否一致: ```bash # 提取崩溃日志的 UUID grep --after-context=2 "Binary Images:" app.crash | head -n 3 # 提取 .dSYM 文件的 UUID dwarfdump --uuid YourApp.app.dSYM ``` 如果 UUID 不匹配,符号化会失败。 - **安装 Xcode 命令行工具**:确保 Xcode 已安装,并在终端运行: ```bash xcode-select --install ``` #### 步骤 2: 手动解析和符号化 使用 Xcode 自带的 `symbolicatecrash` 脚本进行符号化。这是最常用的方法,因为它自动处理调用栈。 1. **定位 symbolicatecrash 脚本**:脚本路径可能因 Xcode 版本变化,使用 `find` 命令搜索: ```bash find /Applications/Xcode.app -name symbolicatecrash -type f ``` 通常路径为:`/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash`。 2. **设置环境变量**:将脚本路径添加到 PATH,并指定开发者目录: ```bash export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" ``` 3. **运行符号化命令**:在终端中执行: ```bash /path/to/symbolicatecrash -o output.txt app.crash YourApp.app.dSYM ``` - `app.crash` 是你的崩溃日志文件。 - `YourApp.app.dSYM` 是你的 .dSYM 文件路径。 - `-o output.txt` 指定输出文件(可省略,默认输出到终端)。 4. **备选方法:使用 `atos` 命令**:如果 `symbolicatecrash` 失败,或需要更细粒度控制,可以用 `atos` 手动转换地址: ```bash # 示例:转换单个地址(地址来自崩溃日志的调用栈) atos -arch arm64 -o YourApp.app.dSYM/Contents/Resources/DWARF/YourApp -l 0x100000000 0x00000001000abcde ``` - `-arch` 指定架构(如 arm64),从崩溃日志的 "Binary Images" 部分获取。 - `-l` 指定加载地址(基地址)。 - 输出直接显示在终端。 #### 步骤 3: 查看和输出结果 - **输出位置**: - 使用 `symbolicatecrash` 时,如果指定 `-o output.txt`,结果会保存到 `output.txt` 文件。 - 未指定输出文件时,结果直接打印到终端窗口。 - **结果内容**:解析后的日志包含: - **崩溃原因**:如 `EXC_BAD_ACCESS` 或 `SIGABRT`。 - **调用栈(backtrace)**:符号化后的函数调用序列,显示类名、方法名和源代码行号。 - **线程信息**:标识崩溃发生的线程。 - **示例输出片段**: ``` Thread 0 Crashed: 0 libsystem_kernel.dylib 0x00000001c4a5c0dc __pthread_kill + 8 1 YourApp 0x00000001000abcde -[ViewController crashMethod] (ViewController.m:42) 2 UIKitCore 0x00000001f0e3a7d4 -[UIApplication sendAction:to:from:forEvent:] + 96 ... ``` 这表示崩溃发生在 `ViewController.m` 文件的第 42 行方法 `crashMethod` 中。 #### 常见问题和提示 - **错误处理**:如果符号化失败,检查 UUID 匹配、文件路径是否正确,或尝试重新生成 .dSYM 文件(在 Xcode 中 Build Settings > Debug Information Format 设置为 DWARF with dSYM File)。 - **自动化工具**:对于频繁分析,建议使用 Xcode 的 Organizer(Window > Organizer > Crashes)自动处理日志[^1]。 - **输出格式**:结果通常是纯文本,便于阅读或分享。你可以用文本编辑器(如 TextEdit)或命令行工具(如 `cat output.txt`)查看。 通过以上步骤,你可以高效地将原始崩溃日志转化为可操作的调试信息,加速问题修复[^1]。 ### 相关问题 1. 如何验证崩溃日志和 .dSYM 文件的 UUID 是否匹配? 2. 如果 .dSYM 文件丢失,如何恢复或重新生成? 3. 有哪些工具可以自动化 iOS 崩溃日志的收集和分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值