A
Air官方
应用崩溃后,系统生成故障日志(faultlog 族)。读懂这三类文件,是崩溃排查的基本功。
▍三类文件
应用崩溃日志:native 崩溃(信号类,段错误、中止信号)的现场记录,含寄存器、调用栈、内存映射。应用冻结日志:应用无响应被系统处置的记录(看门狗超时),栈里能看到卡在哪个线程哪个调用。JS 异常日志:ArkTS 层未捕获异常的记录。取件位置:设备上的故障日志目录(文件传输命令拉取),或用设备工具一键收集。
▍崩溃日志的读法
按顺序读四块:一,头部信息(进程、时间、信号类型)——信号类型直接给方向:段错误多是空指针与越界,中止信号多是主动断言或内存分配器发现堆损坏。二,调用栈——重点看崩溃线程的栈顶几帧,配合符号表还原(符号准备篇)。三,寄存器——崩溃指令的上下文,空指针访问时地址寄存器的值(接近零的值是强信号)。四,内存映射——崩溃地址落在哪个库的区间,粗定位责任模块(自己的库、框架栈、还是系统库)。
▍冻结日志的读法
冻结的本质:主线程或输入通道被卡超时。栈里找卡点:主线程栈顶若在等待(锁、条件变量、IO),看它在等谁;配合其他线程的栈找持锁者或忙碌者。两大常见根因模板:主线程干了重活(初始化、同步 IO);死锁(互相等待的环,把各线程栈画成等待图看环)。
▍从日志到修复
流程:拉日志——定性(信号或超时)——栈还原(符号表)——定位模块——复现路径推断——修复——回归。注意:崩溃栈可能是次生现场(真正的错在更早),日志与文件日志(应用自己的)交叉看时间线。
▍常见陷阱
栈不可读(优化或栈损坏):从内存映射与寄存器反推;偶发崩溃:连续采集多份对比公共帧;崩溃在第三方库:拿符号或按版本已知问题排查。
▍自测
拿一份历史崩溃日志,五分钟内说出:信号类型、崩溃线程、责任库、疑似函数。练到这个水平,faultlog 就是你最好的朋友。
有疑问欢迎在本板块直接发帖,我们会逐条回复。
▍三类文件
应用崩溃日志:native 崩溃(信号类,段错误、中止信号)的现场记录,含寄存器、调用栈、内存映射。应用冻结日志:应用无响应被系统处置的记录(看门狗超时),栈里能看到卡在哪个线程哪个调用。JS 异常日志:ArkTS 层未捕获异常的记录。取件位置:设备上的故障日志目录(文件传输命令拉取),或用设备工具一键收集。
▍崩溃日志的读法
按顺序读四块:一,头部信息(进程、时间、信号类型)——信号类型直接给方向:段错误多是空指针与越界,中止信号多是主动断言或内存分配器发现堆损坏。二,调用栈——重点看崩溃线程的栈顶几帧,配合符号表还原(符号准备篇)。三,寄存器——崩溃指令的上下文,空指针访问时地址寄存器的值(接近零的值是强信号)。四,内存映射——崩溃地址落在哪个库的区间,粗定位责任模块(自己的库、框架栈、还是系统库)。
▍冻结日志的读法
冻结的本质:主线程或输入通道被卡超时。栈里找卡点:主线程栈顶若在等待(锁、条件变量、IO),看它在等谁;配合其他线程的栈找持锁者或忙碌者。两大常见根因模板:主线程干了重活(初始化、同步 IO);死锁(互相等待的环,把各线程栈画成等待图看环)。
▍从日志到修复
流程:拉日志——定性(信号或超时)——栈还原(符号表)——定位模块——复现路径推断——修复——回归。注意:崩溃栈可能是次生现场(真正的错在更早),日志与文件日志(应用自己的)交叉看时间线。
▍常见陷阱
栈不可读(优化或栈损坏):从内存映射与寄存器反推;偶发崩溃:连续采集多份对比公共帧;崩溃在第三方库:拿符号或按版本已知问题排查。
▍自测
拿一份历史崩溃日志,五分钟内说出:信号类型、崩溃线程、责任库、疑似函数。练到这个水平,faultlog 就是你最好的朋友。
有疑问欢迎在本板块直接发帖,我们会逐条回复。
楼主
7 天前