iOS Crash 分析攻略,死磕原理

本文详细介绍了iOS应用崩溃分析的关键步骤,包括理解Crash异常码、Crash堆栈、Thread State、Binary Images和现场勘探法。通过Xcode的symbolicatecrash工具进行堆栈符号化,以及掌握汇编定位法,能够更有效地定位和解决问题。同时,文章提到了Kafka进阶知识点,但主要内容聚焦在iOS Crash分析上。
摘要由CSDN通过智能技术生成
  • CrashReporter Key: CrashReporter 的 uuid, 如果自己捕获日志,这个可以忽略。

  • Hardware Model: 机型

  • Process: 进程名和进程ID

  • Path: 进程的可执行文件路径

  • Identifier: Info.plist 中配置的 CFBundleIdentifier 值

  • Version: CFBundleVersion (CFBundleVersionShort) 即应用的Build号+版本号

  • Code Type: 机型的 CPU 架构,但是不是详细的架构名。比如 arm64e 在这里也是 ARM-64

  • Parent Process: 父进程和进程ID

  • Data/Time: Crash发生的具体时间。

  • Launch Time: 进程启动时间

  • OS Version: iOS 系统版本和 build号

  • Report Version: Crash日志格式的版本号,一般是 104。如果这个version偏高,用系统的symbolicatecrash命令不能符号化日志,一般如果看到是204, 改成104之后用symbolicatecrash就可以符号化了

Crash 异常码


在 Crash 头部信息之下, 会有个段记录了 Crash 异常码。类似下图:

这里我们应该关注:

  • Exception Type: 异常码,一般格式是 Mach异常码 ( UNIX 信号类型 )

  • Exception Subtype: 一般情况里面带的是 Mach异常的 subcode, 还有 Crash 相关地址信息。

  • Triggered by Thread: 发生Crash的线程,大部分情况到这个线程的堆栈里面去看 Crash 堆栈。

  • Application Specific Information: 如果是 Objc/c++ Exception 异常,这里是异常的信息,这个是定位异常的关键信息

  • Last Exception Backtrace: 抛出异常的代码堆栈, 如果是 Objc/c++ Exception 异常造成的 Crash,就看这个堆栈,Crashed Thread: 里的堆栈是 abort(),没有意义。

附异常码的解释, 非所有异常码,只是我们 Crash 中可能会看到的 :

Mach 异常

UNIX 信号

简介

案例

EXC_BAD_ACCESS

SIGBUS

总线错误

1、内存地址对齐出错 2、试图执行没有执行权限的代码地址


SIGSEGV

段错误

1、访问未申请的虚拟内存地址

2、没有写权限的内存写入

EXC_BAD_INSTRUCTION

SIGILL

非法指令,即机器码指令不正确

1, iOS 上偶现的问题,遇到之后用户会连续闪退,直到应用二进制的缓存重新加载 或重启手机。此问题挺影响体验,但是报给苹果不认,因为苹果那边没有收集到,目前没有太好办法。因为 iOS 应用内无法对一篇内存同时获取 w+x 权限的,因此应用无法造成此类问题,所以判断是苹果的问题。

EXC_ARITHMETIC

SIGFPE

算术运算出错,比如除0错误

iOS 默认是不启用的,所以我们一般不会遇到

EXC_SOFTWARE (我们在 Crash 日志中一般不会看到这个类型,苹果的日志里会是

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值