Crash 日志 简单分析 缩小查找范围

看懂 Crash 日志

QQ20220127-155704@2x.png

Crash 头部信息

  • Incident Identifier:每个 Crash 生成的唯一的 uuid.

  • 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 异常码。类似下图:


QQ20220127-161057@2x.png

这里我们应该关注:

  • 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 异常 简介 使用场景
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 日志中一般不会看到这个类型,苹果的日志里会是 EXC_CRASH) (SIGSYS) 系统调用异常
SIGPIPE 管道破裂 1, Socket通信是可能遇到,如读进程以及终止时,写进程继续写入数据。2, 根据苹果的文档,我们可以忽略这个信号https://developer.apple.com/library/archive/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html
SIGABRT abort() 发生的信号 典型的软件信号,通过 pthread_kill() 发送
SIGKILL 进程内无法拦截 1, exit(), kill(9) 等函数调用 2, iOS系统杀进程用的,比如 watchDog 杀进程
EXC_BREAKPOINT SIGTRAP 由断点指令或其它trap指令产生 部分系统框架里面会用 __builtin_trap() 来产生一个 SIGTRAP 类型的 Crash
EXC_GUARD 文件句柄错误 试图 close 一个内核的 fd.
EXC_RESOURCE 资源受限 线程调度太频繁,子线程每秒被唤醒次数超过150:https://stackoverflow.com/questions/25848441/app-shutdown-with-exc-resource-wakeups-exception-on-ios-8-gm

Crash 堆栈

下面一张图介绍了 Crash 堆栈中每个段的含义(在网上找的说的挺细):


1346982-d01e701afe7cdd32.png

Signal信号的类型:

  • SIGABRT–程序中止命令中止信号
  • SIGALRM–程序超时信号
  • SIGFPE–程序浮点异常信号
  • SIGILL–程序非法指令信号
  • SIGHUP–程序终端中止信号
  • SIGINT–程序键盘中断信号
  • SIGKILL–程序结束接收中止信号
  • SIGTERM–程序kill中止信号
  • SIGSTOP–程序键盘中止信号
  • SIGSEGV–程序无效内存中止信号
  • SIGBUS–程序内存字节未对齐中止信号
  • SIGPIPE–程序Socket发送失败中止信号
    SIGABRT
    就crash而言,SIGABRT是一个比较好解决的,因为他是一个可掌控的crash。App会在一个目的地终止,因为系统意识到app做了一些他不能支持的事情。
    通常, SIGABRT 异常是由于某个对象接收到未实现的消息引起的。 或者,用简单的话说,在某个对象上调用了不存在的方法。
    SIGSEGV
    SIGSEGV程序无效内存中止信号,一般是表示内存不合法,
    SIGBUS
    SIGBUS程序内存字节未对齐中止信号,

补充常见的Exception Codes代码类型

Exception Codes: 常见代码有以下几种
0x8badf00d错误码:Watchdog超时,意为“ate bad food”。
0xdeadfa11错误码:用户强制退出,意为“dead fall”。
0xbaaaaaad错误码:用户按住Home键和音量键,获取当前内存状态,不代表崩溃。
0xbad22222错误码:VoIP应用(因为太频繁?)被iOS干掉。
0xc00010ff错误码:因为太烫了被干掉,意为“cool off”。
0xdead10cc错误码:因为在后台时仍然占据系统资源(比如通讯录)被干掉,意为“dead lock”
异常代码0x8badf00d指示应用程序已终止的iOS 因为看门狗超时发生,应用程序时间太长、终止,或对系统时间作出相应。一个常见的原因是做在主线程上的同步联网。无论操作是线程0上,需要搬到后台线程,或处理方式不同,所以它不会阻止在主线程。

补充常见的Exception Type异常类型的信息:

1、EXC_BAD_ACCESS:此类型是最常见的crash, 通常用于访问了不该访问的内存导致的,一般EXC_BAD_ACCESS后面的()还会带有补充信息
野指针错误形式在Xcode中通常表现为:Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)错误。因为你访问了一块已经不属于你的内存。
2、SIGSEGV:通常由于重复释放对象导致, 一般在ARC以后很少见到
3、SIGABRT: 收到Abort信号退出, 通常Foundtion库中的容器为了保护状态正常会做一些检测, 例如插入nil到数据中等会遇到此类错误.
4、SEGV(Segmentation Violation):代表无效内存地址, 比如空指针, 未初始化指针, 栈溢出等.
5、SIGBUS:总栈错误, 与SIGSEGV不同的是, SIGSEGV访问的是无效的地址, 而SIGBUS访问的是有效的地址, 但是总栈访问异常(如地址对齐问题)
6、SIGILL: 尝试执行非法的指令, 可能不被识别或者没有权限
7、SIGFPE: 数学计算相关问题, 比如除零操作
8、SIGIPIPE: 管道另一端没有进程接手数据
9、EXC_BAD_INSTRUCTION:此类异常通常由于线程执行非法指令导致
10、EXC_ARITHMETIC:除零错误会抛出此类异常

Crash 分析方法

请查看网上文章比较详细:详细1 详细2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容