前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS 堆栈符号解析最佳实践

iOS 堆栈符号解析最佳实践

原创
作者头像
QQ空间开发团队
修改于 2017-10-31 10:07:09
修改于 2017-10-31 10:07:09
4.2K00
代码可运行
举报
运行总次数:0
代码可运行

作者:林伟勋

导语

本文介绍了如何解析 iOS 的 crash 堆栈,分别使用了symbolicatecrash来自动解析整个堆栈,以及使用atos 来解析单个地址的符号。

在 iOS 开发中,解决 crash 问题是比较常见的工作。其中能够解析出符号当然是定位问题的开始。

实际工作中,也有看到很多人其实会卡在解析符号这里,遇到这种情况,可以按照本文中的做法解决。

使用 symbolicatecrash 解析堆栈

symbolicatecrashXcode 自带的 crash 符号解析工具,可以自动搜索本地符号表,解析整个 crash 堆栈。

确认 Xcode 环境

首先,需要确认 Xcode 的环境,执行以下代码,获取当前 Xcode 的目录。

/usr/bin/xcode-select -print-path 结果应该是:

/Applications/Xcode.app/Contents/Developer/ 如果结果不是上述的路径,则指定一下路径:

sudo /usr/bin/xcode-select -switch /Applications/Xcode.app/Contents/Developer/ 准备好解析堆栈符号的工具:symbolicatecrash

需要先找到 symbolicatecrash 所在的路径,以Xcode 7.3 版本为例,执行:

find /Applications/Xcode.app -name symbolicatecrash -type f 将会返回:

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash 可以做一个快捷方式:

alias symbolicatecrash='/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash' 需要先配置好DEVELOPER_DIR,否则会报错。如下:

export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer/

开始解析

准备好 dSYM 文件和 app 文件,可以存放在任何位置,只要 mac 系统的 spotlight 能够找到就行。 接着执行

symbolicatecrash xxx.crash

就可以解析符号了。

找不到符号的解决方法

首先,需要确认一下符号表是不是正确的。可以通过以下方式看看符号文件和堆栈是否是对应的 (判断 uuid 是否相同):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dwarfdump --uuid MyApp.app/MyApp
dwarfdump --uuid xxx.app.dSYM/Contents/Resources/DWARF/Resources/MyApp
grep "0x.*com.wison.xxx .*<" NoSymbolsTestxxx.crash

如果不一样,那么说明崩溃堆栈和符号文件对应不上,很可能是搞错版本,或者打包的时候有问题导致符号文件生成不正确。 如果输出一样的 uuid,那么就是对应的,此时 symbolicatecrash 应该可以正常解析符号。 如果还是不能正确解析,那么很可能是 mdfind 自动查找的问题。 Xcode 找符号文件的时候,是通过 mdfind 来找的,比如:

mdfind 'com_apple_xcode_dsym_uuids = *'

该命令会把当前环境下的所有符号文件找出来。 如果你的符号文件不在此列表中,说明 mdfind 找不到我们的符号,

那么就在执行symbolicatecrash的时候显式指定dSYM文件的路径:

symbolicatecrash xxx.crash xxx.dSYM/Contents/Resources/DWARF/MyApp

如果还是不能解析,试一试把 App 文件也指定:

symbolicatecrash xxx.crash xxx.dSYM/Contents/Resources/DWARF/MyApp MyApp.app/MyApp

使用 atos 解析单个符号

有时候我们需要解析单个地址的符号,比如 lr 寄存器的地址对应的符号,就需要用到 atos 用法如下:

atos -arch [armv7 or arm64] -o [BinaryFile or dSYMFile] -l loadAddress address

其中 -arch 指定二进制的架构,比如 armv7,armv7s,arm64 等等。

-o 指定符号文件,可以是 dSYM 文件,也可以是包含了符号表的可执行文件。 -l是加载地址,由于 Xcode 默认打开 PIE 选项,所以加载地址每次都不一样,所以需要指定,可以在 crash 堆栈的 Binary Image 那段看到应用的加载地址。 最后一个参数是需要解析符号的地址。

原文地址:http://wisonlin.github.io/2016/04/09/解析-crash-堆栈/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用symbolicatecrash解析了一个crash log
有一天,测试同学给了我一个未经符号化的崩溃日志。如果是以前,我会找到打这个测试包的同事,让他将奔溃日志符号化后发给我。但是这次,我老板傲娇的拒绝了,而是让我自己来做符号化的工作>.<
且行且珍惜_iOS
2021/09/07
9250
iOS 使用Xcode自带工具symbolicatecrash解析Crash文件
每次遇到闪退信息的时候都要敲一遍命令,所以趁现在写个脚本来解析闪退信息,需要的信息有文件有:
傅_hc
2019/12/23
3.7K0
Xcode 常见 CLI 工具
在咱们日常开发中,或多或少都会用到 Xcode 内置的一些CLI工具,但是大部分小伙伴可能只是会用到一些具体的命令,今天我们就一起来聊一聊 Xcode 内置的常见Command Lines Tool。
CoderStar
2022/09/23
3.7K0
iOS_crash文件的获取及符号化(解析)
稍等一会,就会输出路径,然后将路径复制,右键 Finder -> 前往文件夹 -> 粘贴 -> 回车,就能找到symbolicatecrash,将symbolicatecrash拷贝出来备用
mikimo
2023/10/18
2.6K1
iOS符号化浅析
十一去云南(丽江、大理、昆明)玩了一趟,怎么说呢,可能我想象中的云南是西双版纳、香格里拉那样子的,所以这次云南之行跟想象中还是有一定差异的。
CoderStar
2022/09/23
2K0
iOS符号化浅析
XCode日常使用备忘录
0. Introduction        XCode是macOS上开发app不可缺少的开发者工具,不管是开发macOS上的应用,还是iOS上的应用,都离不开XCode环境。尽管其易用性广受诟病,但由于苹果app开发的封闭性,众多开发者也不有苦不能言。近年来微软针对macOS平台发布了Visual Studio Code和Visual Studio for Mac这两款开发工具,但是其目的显然只是作为XCode的一种补充,要全盘替代XCode目前还不太现实。平时工作中由于负责开发维护Windows和Mac
24K纯开源
2018/01/18
1.9K0
XCode日常使用备忘录
​iOS Class Guard github用法、工作原理和安装详解及使用经验总结
iOS Class Guard是一个用于OC类、协议、属性和方法名混淆的命令行工具。它是class-dump的扩展。这个工具会生成一个symbol table,这个table在编译期间会包含进工程中。iOS-Class-Guard能有效的隐藏绝大多数的类、协议、方法、属性和 实例变量 名。iOS-Class-Guard不是应用安全的最终解决方案,但是它绝对能让攻击者更难读懂你的程序。iOS-Class-Guard会加大代码分析和runtime检查的难度,这个工具可以认为是一个简单基础的混淆方法。由于OC的架构决定了iOS应用程序的剖析相当简单,check out一下链接就知晓了:
iOS Magician
2023/12/02
4040
​iOS Class Guard github用法、工作原理和安装详解及使用经验总结
iOS崩溃日志ips文件解析
  测试组的同事在进行稳定性测试时,通常会遇到一些崩溃,然后他们会将这些崩溃日志(一般是ips格式的文件)反馈给开发进行分析,但是这些ips文件中的内容通常是如下图这样的,都是一些十六进制的堆栈地址,如果仅仅根据这些堆栈地址,我们基本无法做任何事情,连最基本的崩溃定位都做不到。那么,在iOS开发中,还有一些其他的方法可以帮助我们将这些堆栈信息转化为可视化的日志文件,在转化后的可视化日志文件中,我们可以清晰定位到我们的应用崩溃的位置,如下图2所示。
mukekeheart
2018/08/20
7.7K0
iOS崩溃日志ips文件解析
有赞crash平台符号化实践
有赞在基础保障平台的实践中完成了 Crash平台 的建设,但是iOS的崩溃日志未经符号化,排查问题比较困难。为了降低iOS App的crash率,快速排查线上crash,疑难crash的跟踪处理,符号化崩溃日志显得尤为重要!
有赞coder
2020/09/21
1.5K0
有赞crash平台符号化实践
[译] 苹果在 iOS 10.1 和 macOS 10.12 中使用了 Swift
Swift 是在 WWDC 2014 上发布的。Apple 的大部分示例代码项目现在都是用 Swift 编写的。但是 Apple 在 iOS 10.1 和 macOS 10.12.1 中使用 Swift 吗?
韦弦zhy
2021/12/24
1.6K0
[译] 苹果在 iOS 10.1 和 macOS 10.12 中使用了 Swift
深入理解iOS Crash Log
USB连接设备,接着在XCode菜单栏依次选择:Window -> Devices And Simulators,接着选择View Device Logs
用户2932962
2019/07/31
4.4K1
深入理解iOS Crash Log
iOS崩溃堆栈符号化,定位问题分分钟搞定!
最近一段时间,在跟开发者沟通过程中,萝莉发觉有些开发者对iOS的应用符号表还不是很清楚,除了咨询关于符号表生成、配置的问题以外,对Bugly崩溃分析需要配置符号表也存在疑问。 在这里,萝莉就给大家分享下关于iOS符号表的一些内容。 首先,进行常识“脑补”。 1. 符号表是什么? 符号表就是指在Xcode项目编译后,在编译生成的二进制文件.app的同级目录下生成的同名的.dSYM文件。 .dSYM文件其实是一个目录,在子目录中包含了一个16进制的保存函数地址映射信息的中转文件,所有Debug的symbols都
腾讯Bugly
2018/03/22
4.9K0
了解和分析iOS Crash Report
翻译自苹果官方文档:Understanding and Analyzing Application Crash Reports
nimomeng
2018/09/13
1.8K0
了解和分析iOS Crash Report
如何符号化Objective-C调用栈如何符号化Objective-C调用栈
本文讲述的是符号化“残破”的栈,如果你有一个系统生成的crash日志,请交给Xcode自带的symbolicatecrash脚本。
且行且珍惜_iOS
2021/09/07
8750
无源调试
一般App都会接入第三方的Crash报告SDK,比如友盟SDK,或者腾讯的bugly,当有crash的时候,SDK记录的crash记录的堆栈一般情况下可以很清晰地定位到源码的具体某一行,根据代码处理即可。但是有小部分情况下,crash记录的堆栈是系统堆栈,没有开发者的源码。
Helloted
2022/06/08
4710
无源调试
iOS开发——解析崩溃日志
在实际的开发过程中,作为开发者的我们常常会碰到一种场景,那就是真机调试时崩溃了,而有时又不能在Xcode中打印出崩溃信息,那么这时候我们就必须要获取到崩溃原因,从而解决问题。
Originalee
2018/08/30
1.4K0
iOS开发——解析崩溃日志
Xcode编译疾如风-3.浅谈 dwarf 和 dSYM
小菜:本文是《Xcode编译疾如风-4.BuildSettings》的其中的Debug Information Format 配置项的背景知识前置科普文。
ChildhoodAndy
2021/05/11
4.5K0
atos命令解析iOS/Mac 崩溃日志
这里简单介绍下怎么通过atos命令来解析iOS/Mac 崩溃日志,适合拿到一份未经符号化的crash日志需要开发人员手动符号化的场景
zqh
2024/01/23
1.8K0
友盟bug日志分析
1、去友盟后台,我的产品->移动统计->错误分析,找到有哪些bug日志,并把日志下载下来。
用户6094182
2019/08/23
1.3K0
友盟bug日志分析
iOS如何获取崩溃日志
在日常测试iOS中会经常遇到App崩溃的情况,然后给研发提bug。如果就提bug就有一两句话描述,研发很难精准排查问题,所以作为测试人员需要提供崩溃日志或者崩溃堆栈辅助研发排查问题。
测试加
2022/12/05
3.5K0
iOS如何获取崩溃日志
相关推荐
使用symbolicatecrash解析了一个crash log
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验