crash堆栈
1 | Thread 31 name: dart:io EventHandler |
源码
1 | void EventHandlerImplementation::EventHandlerEntry(uword args) { |
crash现场还原
1 | 0 Flutter 0x000000010628adb0 dart::bin::EventHandlerImplementation::EventHandlerEntry (in Flutter) (eventhandler_macos.cc:375) |
- 计算偏移量
0x000000010628adb0 - 0x105f8c000 = 3141040
- 在xcode调试控制台 获取Flutter库的 载入地址
image list Flutter
1 | (lldb) image list Flutter |
- 计算实际地址,设置断点
0x00000001000e0000 + 3141040 = 0x1003dedb0
1 | breakpoint set -a 0x1003dedb0 |
分析寄存器与变量之间的对应关系
进入断点后,进行进一步的分析。
1 | loc_2fed24: |
从 crash 报告的保留 register 来看:
1 | Thread 31 crashed with ARM-64 Thread State: |
1 | //大小为 0x20 |
r20 为循环变量 i 的值,此时为 0;r26为参数size的值,此时为 1;而r27则是代表 events + i的地址,从汇编也能看出来 r27 每次递增 0x20 ,正好是 struct kevent 的值,此时r27的值为 0。
也就是说传入的events参数为 NULL,而此处没有判空处理导致的崩溃。
events 参数为 NULL
由代码当中可以看出,传入 HandleEvents 的第一个参数是栈上的地址,不可能为空,此处是某种原因导致的栈上的数据被破坏,导致读出来的数据为 NULL 造成崩溃