说明
分享一种crash问题定位的一种解决方法,仅供参考。
ARM32平台上通过错误使用内存,触发系统异常,系统崩溃。系统异常被挂起后,能在串口中看到异常调用栈打印信息和关键寄存器信息。
如下所示,excType表示异常类型,值为4表示数据终止异常,其它数值可以查看芯片手册。
通过这些信息可以基本定位到异常所在函数和其调用栈的关系,为分析系统死机崩溃提供分析,便于查找问题所在。
crash日志
[11:31:32.475]收←◆--- device idle,timeout=10000,lastT=77601,curT=87612
orbSendcmd: | F5 AE 02 FE 04 00 33 00 00 00 26 FD |
data_abort fault fsr:0x29, far:0x00000001
Abort caused by a read instruction. Domain fault, section
excType = 0x4
taskName = DeviceStaThd
taskID = 29
task stackSize = 24576
system mem addr = 0x40aaecc0
excBuffAddr pc = 0x4004cf34
excBuffAddr lr = 0x400522dc
excBuffAddr sp = 0x400f8340
excBuffAddr fp = 0x41300354
R0 = 0x1
R1 = 0x0
R2 = 0x7fffffff
R3 = 0xffffffff
R4 = 0x7fffffff
R5 = 0x1
R6 = 0x0
R7 = 0x0
R8 = 0x0
R9 = 0x1
R10 = 0x0
R11 = 0x41300354
R12 = 0xffffffff
CPSR = 0x20000013
*******backtrace begin*******
traceback 0 -- lr = 0x 400537ec fp = 0x4130065c
traceback 1 -- lr = 0x40054a74 fp = 0x4130075c
traceback 2 -- lr = 0x40055ab8 fp = 0x41300824
traceback 3 -- lr = 0x40471a8c fp = 0x41300c9c
traceback 4 -- lr = 0x40145f54 fp = 0x41300d24
traceback 5 -- lr = 0x40146384 fp = 0x41300db4
traceback 6 -- lr = 0x40146930 fp = 0x41300dc4
traceback 7 -- lr = 0x40046c58 fp = 0x41300dd4
traceback 8 -- lr = 0x4005044c fp = 0xb0b0b0b
利用反汇编文件.asm
打开编译后生成的 asm 反汇编文件
搜索PC指针 0x4004cf34 在asm文件中的位置(去掉0x)。

文章详细描述了在ARM32平台上由于错误的内存使用导致系统崩溃的分析过程。通过异常调用栈、关键寄存器信息以及反汇编文件,定位到问题发生在`memchr`函数,由`strnlen`调用,最终追溯到打印接口的`printf`系列函数。通过堆栈回溯确定问题是由于打印接口导致的内存访问异常,从而定位到具体代码段。
最低0.47元/天 解锁文章
145

被折叠的 条评论
为什么被折叠?



