iOS崩溃日志分析

iOS应用崩溃日志分析工具:高效定位问题 在iOS应用开发中,应用崩溃是不可避免的现象,这些崩溃信息会以日志的形式存储,成为开发者分析和解决问题的重要资源。崩溃日志分析工具可以帮助我们理解崩溃的原因,快速定位问题所在,并提供解决问题的线索。掌握这些工具的使用是提高应用质量的关键步骤。iOS开发者通常依赖于Xcode自带的工具,如Instruments和Console,以及第三方工具如Crashlytics等。这些工具提供了从基础崩溃日志分析到高级的实时崩溃报告功能,能够帮助开发者从不同的角度和维度深入理解崩溃情况,快速响应和解决崩溃问题。 阅读详情

环境

macOS Mojave 10.14.3
Xcode10.1
iPhone6S 10.0.1

获得崩溃日志

方式一:Xcode

菜单 > Window > Devices and Simulators

选择设备并查看设备日志(View Device Logs)

方式二:手机

设置 > 隐私 > 诊断与用量 > 诊断与用量数据

崩溃日志的结构

头部(Header)

  • Incident Identifier: 崩溃日志的唯一标识
  • CrashReporter Key: 匿名的设备标识
  • Process:进程名
  • Path:二进制文件路径
  • Identifier:包名
  • Version:应用版本号
  • Code Type: 目标架构
  • Role:进程终止时进程被赋予的task_role枚举值
    …
Incident Identifier: F21EC10C-018D-494F-997D-E9C9D82B2F7F
CrashReporter Key:   ab7fcdf6938542fd82446362e0481f7fddba141f
Hardware Model:      iPhone6,2
Process:             JACrash [27195]
Path:                /private/var/containers/Bundle/Application/EDDDCB8E-75CE-4638-84CA-5B7971F6EFE0/JACrash.app/JACrash
Identifier:          com.ishepherdme.JACrash
Version:             1 (1.0)
Code Type:           ARM-64 (Native)
Role:                Foreground
Parent Process:      launchd [1]
Coalition:           com.ishepherdme.JACrash [4182]


Date/Time:           2019-02-08 13:03:58.7771 +0800
Launch Time:         2019-02-08 13:03:58.3811 +0800
OS Version:          iPhone OS 10.0.1 (14A403)
Report Version:      104

异常信息(Exception Information)

  • Triggered by Thread: 产生崩溃的线程
  • Exception Type: 崩溃类型
    …
Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  0

其他诊断信息

  • Application Specific Information:在进程终止时框架捕获的错误信息
    …
Application Specific Information:
abort() called

Filtered syslog:
None found

线程回溯

罗列崩溃时每个线程的调用栈情况

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib        	0x000000018af0e014 __pthread_kill + 8
1   libsystem_pthread.dylib       	0x000000018afd5460 pthread_kill + 112
2   libsystem_c.dylib             	0x000000018ae823f4 abort + 140
3   libc++abi.dylib               	0x000000018a94d2d4 __cxa_bad_cast + 0
4   libc++abi.dylib               	0x000000018a96acc0 default_unexpected_handler+ 126144 () + 0
5   libobjc.A.dylib               	0x000000018a978844 _objc_terminate+ 34884 () + 124
6   libc++abi.dylib               	0x000000018a96766c std::__terminate(void (*)+ 112236 ()) + 16
7   libc++abi.dylib               	0x000000018a967234 __cxa_rethrow + 144
8   libobjc.A.dylib               	0x000000018a97871c objc_exception_rethrow + 44
9   CoreFoundation                	0x000000018be1a0bc CFRunLoopRunSpecific + 560
10  UIKit                         	0x0000000191df37cc -[UIApplication _run] + 608
11  UIKit                         	0x0000000191dee550 UIApplicationMain + 208
12  JACrash                       	0x000000010007de90 0x100078000 + 24208
13  libdyld.dylib                 	0x000000018adfc5b8 start + 4

线程状态

列出崩溃线程的线程状态。这是一个寄存器列表及其执行停止时的值。在阅读崩溃报告时,无需了解线程状态,但可以使用此信息更好地了解崩溃的情况。

Thread 0 crashed with ARM Thread State (64-bit):
    x0: 0x0000000000000000   x1: 0x0000000000000000   x2: 0x0000000000000000   x3: 0x00000001740e9737
    x4: 0x000000018a96bbc3   x5: 0x000000016fd87520   x6: 0x000000000000006e   x7: 0xffffffffffffffec
    x8: 0x0000000008000000   x9: 0x0000000004000000  x10: 0x000000000000000b  x11: 0x0000000000000010
   x12: 0x000000018ae99792  x13: 0x0000000000000000  x14: 0x0000030000000300  x15: 0x0000000000000000
   x16: 0x0000000000000148  x17: 0x0000000000000000  x18: 0x0000000000000000  x19: 0x0000000000000006
   x20: 0x00000001b0bf8c40  x21: 0x000000016fd87520  x22: 0x00000001b0bffbb8  x23: 0x0000000000000001
   x24: 0x0000000170011110  x25: 0x0000000000000000  x26: 0x0000000000000001  x27: 0x0000000000000000
   x28: 0x000000016fd87b80   fp: 0x000000016fd87480   lr: 0x000000018afd5460
    sp: 0x000000016fd87460   pc: 0x000000018af0e014 cpsr: 0x00000000

二进制镜像

进程二进制文件加载的地址区间,动态库加载的地址区间

Binary Images:
0x100078000 - 0x10007ffff JACrash arm64  <2fd461c16e7239489a037c6c1141c134> /var/containers/Bundle/Application/A55333A1-CD62-41A2-AE96-F3411ECD3447/JACrash.app/JACrash
0x10009c000 - 0x10009ffff MobileSubstrate.dylib arm64  <3134cfb2f722310ea2c742ae4dc131ab> /Library/MobileSubstrate/MobileSubstrate.dylib
0x1000a8000 - 0x1000affff libswiftCoreFoundation.dylib arm64  <47deeaa1967b3e339dfcb48535a994e1> /var/containers/Bundle/Application/A55333A1-CD62-41A2-AE96-F3411ECD3447/JACrash.app/Frameworks/libswiftCoreFoundation.dylib
0x1000bc000 - 0x1000cbfff libswiftCoreGraphics.dylib arm64  <25fe91aa901b3cf6a443b498012ab5af> /var/containers/Bundle/Application/A55333A1-CD62-41A2-AE96-F3411ECD3447/JACrash.app/Frameworks/libswiftCoreGraphics.dylib
0x1000f0000 - 0x1000f7fff libswiftCoreImage.dylib arm64  
....

关于异常类型(Exception Type)

野指针(Bad Memory Access [EXC_BAD_ACCESS // SIGSEGV // SIGBUS])

尝试访问了非法的内存地址,或访问了受保护的地址

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x000000064229beb8
Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [0]
Triggered by Thread:  0

比如在MRC环境下尝试发送消息给已释放的对象,调用栈的特点是objc_msgSend/objc_release在调用栈顶

异常退出(Abnormal Exit [EXC_CRASH // SIGABRT])
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self callCrashMethod];
}

- (void)callCrashMethod {
    [self arrayOutOfBounds];
}

- (void)arrayOutOfBounds {
    NSArray *arr = @[@"0",@"1"];
    NSLog(@"%@",arr[2]);
}

@end
Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  0

崩溃会直接到main,因为调用栈中包含objc_exception_rethrow栈帧,根据参考1,进行如下的配置,设置异常的断点

The Exception Breakpoint
So how do you find the line in the code that made the app crash? Well, whenever you get a stacktrace like this, an exception was thrown by the app. (You can tell because one of the functions in the call stack is named objc_exception_rethrow.)

追踪陷阱(Trace Trap [EXC_BREAKPOINT // SIGTRAP])

这个异常是为调试器提供在进程执行的特定点中断进程的机会。

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x000000010006e588
Termination Signal: Trace/BPT trap: 5
Termination Reason: Namespace SIGNAL, Code 0x5
Terminating Process: exc handler [0]
Triggered by Thread:  0
非法指令(Illegal Instruction)

进程试图执行非法或未定义指令。这个进程可能试图通过一个配置错误的函数指针,跳到一个无效的地址。

Exception Type:  EXC_CRASH (SIGILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Signal: Illegal instruction: 4
Termination Reason: Namespace SIGNAL, Code 0x4
Terminating Process: neteasemusic [6562]
Triggered by Thread:  0
被杀死(Killed[SIGKILL])
Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d
Triggered by Thread:  0
资源限制(Resource Limit [EXC_RESOURCE])

这个进程超出了资源消耗的限制。

符号化

来自参考3

方式一:dSYM文件

DWARF 即Debugging with Attributed Record Formats,Xcode使用它来生成符号表,生成的符号表放在.dSYM文件中,在Debug模式下,默认不会生成.dSYM文件,可以在Build Settings中进行设置

编译后,在工程中Product目录下,选择应用程序,Show in Finder,会发现生成了应用的.dSYM文件

获取UUID
Binary Images:
0x1000f8000 - 0x1000fffff JACrash arm64  <2fd461c16e7239489a037c6c1141c134> /var/containers/Bundle/Application/7B72F18F-930E-42CB-B69C-FED75161A03F/JACrash.app/JACrash

UUID:2fd461c16e7239489a037c6c1141c134

% dwarfdump --uuid path/to/Your.app.dSYM/Contents/Resources/DWARF/JACrash
...
UUID: 2FD461C1-6E72-3948-9A03-7C6C1141C134 (arm64) /Users/Jason/Library/Developer/Xcode/DerivedData/JACrash-bntjxfwsvrraeuevozrbvraorxqv/Build/Products/Debug-iphoneos/JACrash.app.dSYM/Contents/Resources/DWARF/JACrash

两者UDID一致即可

定位崩溃地址
% atos -o path/to/Your.app.dSYM/Contents/Resources/DWARF/Your -arch arm64 -l 0x1000f8000 0x1000fdda8

-[ViewController arrayOutOfBounds] (in JACrash) (ViewController.m:33)

0x1000f8000: 运行时应用基地址
0x1000fdda8: 运行时崩溃地址(待符号化的地址)

支持bitcode

支持bitcode的情况下,因为最终的二进制文件由Apple Store后台生成,本地是没有对应的.dSYM文件,可以从Xcode或iTunes Connect上下载

方式二:崩溃日志 + Hopper

如果没有.dSYM文件,但有崩溃日志的情况时

崩溃地址 = 基地址 + ASLR + 方法偏移地址

方法相对基地址的偏移地址是不变的,因此只要把ASLR从崩溃地址中移除,再加上方法的偏移地址即可

用hopper找出基地址,再加上方法偏移地址

Snip20190208_26

异常捕获监听

/// 函数指针,用于自定义捕获异常后要进行的操作
typedef void NSUncaughtExceptionHandler(NSException *exception);

FOUNDATION_EXPORT NSUncaughtExceptionHandler * _Nullable NSGetUncaughtExceptionHandler(void);
FOUNDATION_EXPORT void NSSetUncaughtExceptionHandler(NSUncaughtExceptionHandler * _Nullable);

在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作

void exceptionHandler(NSException *exception) {
    NSLog(@"%@", [exception reason]);
    NSLog(@"%@", [exception userInfo]);
    NSLog(@"%@", [exception callStackSymbols]);
}

int main(int argc, char * argv[]) {
    NSSetUncaughtExceptionHandler(&exceptionHandler);
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

参考

  1. My App Crashed, Now What? – Part 1
  2. 手动解析CrashLog之----方法篇
  3. Understanding and Analyzing Application Crash Reports
  4. Address space layout randomization
  5. NSSetUncaughtExceptionHandler not catch all errors on iPhone
Swift-iOS崩溃日志分析:提高效率的自动化工具使用 崩溃日志是程序在遇到严重错误而终止时生成的记录文件,它详细描述了程序崩溃前发生的一系列事件,包括错误的类型、错误发生时程序的状态以及系统资源的使用情况。通过分析崩溃日志,开发者可以诊断出导致崩溃的具体原因,进而修复程序中的缺陷。 阅读详情

相关推荐

calibre QRC提取寄生参数

typical将上面的文件QCI_flow里面的文件 在Cp 到当前 ,其实应该是某几个文件,但是我给忘记了 就全cp过来了 ,无影响,不过也希望大佬指正。

2202_75711937的博客 1519

idea通过MacOS文件夹内的idea控制台可运行,应用程序无法运行,闪退(急急急)

第一张图片是运行应用程序闪退的问题报告 第二张是运行macOS内的idea控制台的log 麻烦大家看下怎么解决 哭辽

sun616818的博客 1560

STM32智能头盔DIY全攻略:从心率监测到跌倒报警的完整实现

本文提供了基于STM32的智能头盔完整DIY实现方案,涵盖从心率监测到跌倒报警的核心功能。详细解析了系统设计、硬件搭建、软件算法及系统联调,重点介绍了STM32主控、MAX30102心率传感器和MPU6050姿态传感器的应用,并分享了跌倒检测算法与功耗优化等实战经验,为嵌入式开发与物联网创新项目提供全面指导。

sony5的博客 500

reason: 'launch path not accessible' abort() called 路径获取错误:

Application Specific Information: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'launch path not accessible' abort() called terminating with uncaught exception of

爱技术....爱生活! 3931

2023-12-26~2025-07-04备份

一、海康视觉与汇川机器人 服务器-客户端通信设置IP在同一网段名称IP端口类型海康相机工控机7930服务器机器人3000客户端海康VM服务器设置1通信管理 增添TCP服务端,设置本机IP:192.168.0.20,端口号79302 协议解析 通信双方约定通信格式(设置收发数据格式,分隔符)机器人客户端设置(不同类型机器人设置有差别)1 通讯服务设置 设置连接服务器IP、服务端端口号、机器人端口号,确保连接正常2 协议解析 使用指令代码构建通讯解析。

青铜小码农 3126

武汉理工大学数据结构综合实验——连连看游戏综合实践

文章目录实验目的主要仪器设备及耗材一、实验要求二、分析与设计(非线性结构)1.数据结构的设计2.核心算法设计一条直线消子两条直线消子三条直线消子初始化游戏地图搜寻路径提示和重排3.测试用例设计4.测试效果总结 实验目的 (1)线性结构实验目的 调研连连看游戏,了解连连看游戏的功能和规则等 掌握集成开发工具VS2019的使用和C++的基础编程 了解MFC框架 了解线性结构,掌握数组的遍历、消子和胜负判断等算法 了解企业软件开发过程,应用迭代开发思路进行项目开发,养成良好的编程习惯和培养软件工程化思维 .

mo_zhe的博客 7612

闪退后系统的崩溃记录

报错

guling0420的博客 4269

深入解析SPLL单相软件锁相环:从SOGI原理到PI系数调优实践

本文深入解析SPLL单相软件锁相环技术,从SOGI原理到PI系数调优实践,详细介绍了其在数字电源设计中的应用。通过数学推导和实际调试经验,帮助工程师快速掌握锁相环的核心参数计算和优化方法,提升电网相位追踪的精确度和响应速度。

weixin_30316097的博客 382

Crash优化与建议

文章目录一、Crash与信号1.1 Crash是如何产生的1.1.1 signal1.1.2 signal处理流程1.1.3 signal捕获1.2 Crash日志简析二、Crash优化思路2.1 分析问题2.2 可复现的crash2.3 难复现的crash2.3.1 根据信号分析2.3.2 根据exception信息提示2.3.3 根据异常地址2.3.4 根据寄存器信息2.3.5 根据附加信息2...

3109

【Python百日进阶-Web开发-Feffery】Day385 -“一起Dash”训练营Lesson-07_利用fac构建表单(上)

文章目录前言:fac是什么?“人生苦短,我用Python;Web开发,首选Feffery!”↓↓↓ 今日笔记 ↓↓↓一、费老师课堂1.1 什么是表单1.2 页面效果1.3 课堂源码二、课后作业2.1 页面效果2.2 项目源码 前言:fac是什么? feffery-antd-components(简称fac),是国内大佬费弗里(Feffery)老师基于著名的React UI组件库ant design进行二次开发,将ant design中的诸多实用组件及特性引入Dash,帮助开发者使用极低的纯Python代

专注于医院数据分析技术与系统开发的创作与分享。 251

YOLOv13结合Sobel边缘检测算子,实现EIEM(Edge Information Enhancement Module,边缘信息增强模块),强化空间特征提取

EIEM模块通过巧妙地结合Sobel边缘检测算子和现代卷积网络架构,实现了显式边缘信息增强的创新设计。这种方法不仅提高了网络对边缘特征的敏感性,还保持了良好的计算效率和模块化特性。 从技术实现角度看,EIEM展示了如何将经典计算机视觉算法无缝集成到深度学习框架中,为构建更强大、更可解释的视觉模型提供了新的思路。随着对边缘信息重要性认识的不断深入,以及对网络可解释性需求的增长,EIEM这样的显式特征增强模块将在未来的计算机视觉研究中发挥越来越重要的作用。

FJN110的博客 907

降本增效工具系列(二):IOS 系统 Crash 日志分析实战

当应用程序在IOS设备上崩溃(例如,闪退)时,一份“Crash崩溃报告”将在该设备上创建并存储起来。崩溃报告描述了应用程序是在何种条件下崩溃的,大部分情况下包含一份当前正在运行线程的完整堆栈跟踪。如果设备就在身边,可以连接设备,打开,在左侧面板中选择(可以选择具体设备的或者Library下所有设备的),然后根据时间排序查看设备上的crash日志。这是开发、测试阶段最经常采用的方式。如果应用程序已经提交到App Store发布,用户已经安装使用了,那么开发者可以 通过)获取用户的crash日志。

IT全栈 华强工作室 4942

【ArcGIS Pro微课1000例】0023:ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)

本文讲解ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)的两种方法。

智慧空间实验室 4644

iOS 崩溃日志分析

举个栗子: exception type : NSUnknownKeyException   crash reason : [ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key a.   call stack info : (     0   CoreFo

u010309384的专栏 1245

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

iOS应用崩溃日志分析

iOS应用崩溃日志分析

sf_promise的专栏 570

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ios崩溃日志收集_iOS 崩溃日志分析(个人总结,最实用)

要分析奔溃日志需要三个文件:crash日志,symbolicatecrash分析工具,.dSYM符号集0. 在桌面创建一个crash文件夹1. 需要Xcode自带的崩溃分析工具symbolicatecrash,这个文件的位置参考:/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/...

weixin_36269733的博客 2975

解决iOS应用崩溃:AltStore高级调试与日志分析指南

你是否遇到过侧载应用突然闪退?AltStore安装后无法刷新?本文将带你掌握AltStore的高级调试技巧,通过日志分析和错误追踪,解决90%的常见应用崩溃问题。读完你将学会:查看详细错误日志、导出调试信息、分析崩溃原因,以及利用官方工具快速定位问题。 ## 错误日志查看:定位问题的第一步 AltStore内置了强大的错误日志系统,所有侧载、刷新和JIT编译过程中发生的错误都会被自动记录。通过...

gitblog_00632的博客 548

iOS崩溃日志分析入门

iOS崩溃日志分析入门 怎么获取崩溃日志 见获取日志的N+1中方式 常见crash格式 通常来说,iOS崩溃之后从系统导出的崩溃文件一般是以ips为后缀的,其实就是正常的文字格式,后缀是可以随意改的 Crash的基本信息 Incident Identifier: crashlog 文件唯一标识符,类似于苹果设备的 udid。 Hardware Model: 标识硬件设备类型,如果有许多崩溃日志该字段相同,那么有可能是某种特定机型的问题 Process: 发生崩溃的进程名称和对应的 processID。 P

a2025131311的博客 1626

tidevice Crash日志分析:快速定位iOS应用崩溃问题

iOS应用崩溃是开发和测试过程中常见的问题,而**tidevice**作为一款强大的iOS设备通信工具,提供了便捷的Crash日志分析功能,帮助开发者快速定位应用崩溃原因。本文将详细介绍如何使用tidevice获取和分析Crash日志,让你轻松解决iOS应用崩溃难题。 ## 一、什么是tidevice Crash日志分析? tidevice是一个用于与iPhone设备通信的工具,其中的Cras

gitblog_00277的博客 462

ios崩溃日志收集_iOS崩溃与日志分析

在iOS开发中经常需要靠记录日志来调试应用程序、解决崩溃问题等,整理常用的日志输出和崩溃日志分析。最新更新:2018-11-30基于CocoaLumberjack 的 Swift使用封装库一、崩溃的捕获1、崩溃日志产生原因1、应用中有Bug。2、Watchdog超时机制3、用户强制退出4、低内存终止5、其他违反系统规则的操作,大部分是内存问题发生崩溃,系统会生成一份崩溃日志在本地,或者上传IT...

weixin_39825259的博客 2371

iOS应用崩溃日志分析 iOS应用崩溃日志揭秘

转自:http://www.raywenderlich.com/zh-hans/30818/ios%E5%BA%94%E7%94%A8%E5%B4%A9%E6%BA%83%E6%97%A5%E5%BF%97%E6%8F%AD%E7%A7%98 这篇文章还可以在这里找到 英语 Learn how to make sense of crash logs! 本文作者是 So

黎杰-IT&金融博客 2652
上一篇: Charles HTTP抓包原理
下一篇: ReactNative 入门体验
忘川三
博客等级 码龄12年 208粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值