开发过程中内存崩溃分析(: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xf8)

在项目上线之后,发现一个很不容易发现的内存崩溃,那么该如何定位崩溃的位置呢?,首先从拿到崩溃的堆栈信息,如下:
18244 F DEBUG : Revision: ‘0’
02-27 09:49:42.920 18244 18244 F DEBUG : ABI: ‘arm’
02-27 09:49:42.920 18244 18244 F DEBUG : pid: 14285, tid: 15289, name: Thread-1851 >>> com.xdja.safeclient <<<
02-27 09:49:42.920 18244 18244 F DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xf8
02-27 09:49:42.920 18244 18244 F DEBUG : Cause: null pointer dereference
02-27 09:49:42.921 18244 18244 F DEBUG : r0 000000f8 r1 000000f8 r2 00000010 r3 00000000
02-27 09:49:42.921 18244 18244 F DEBUG : r4 00000000 r5 ffffffff r6 efbdf682 r7 00000000
02-27 09:49:42.921 18244 18244 F DEBUG : r8 00000001 r9 c94145b4 sl efbdf682 fp c89ef845
02-27 09:49:42.921 18244 18244 F DEBUG : ip efbdd584 sp c9413ff8 lr efb8bd69 pc efb67114 cpsr 60070030
02-27 09:49:42.934 18244 18244 F DEBUG :
02-27 09:49:42.934 18244 18244 F DEBUG : backtrace:
02-27 09:49:42.934 18244 18244 F DEBUG : #00 pc 0001a114 /system/lib/libc.so (strlen+71)
02-27 09:49:42.934 18244 18244 F DEBUG : #01 pc 0003ed65 /system/lib/libc.so (__vfprintf+3948)
02-27 09:49:42.934 18244 18244 F DEBUG : #02 pc 0005263d /system/lib/libc.so (vsnprintf+128)
02-27 09:49:42.934 18244 18244 F DEBUG : #03 pc 00008461 /data/app/com.xdja.safeclient-y5ZZZgczoU48NOjvSsf3pA==/lib/arm/libpjlib.so (pj_log+916)
02-27 09:49:42.934 18244 18244 F DEBUG : #04 pc 000086c9 /data/app/com.xdja.safeclient-y5ZZZgczoU48NOjvSsf3pA==/lib/arm/libpjlib.so (pj_log_4+32)
02-27 09:49:42.934 18244 18244 F DEBUG : #05 pc 000029d3 /data/app/com.xdja.safeclient-y5ZZZgczoU48NOjvSsf3pA==/lib/arm/libxcrypto_java.so (xcrypto_java_dev_ctx_init+310)
根据y5ZZZgczoU48NOjvSsf3pA==/lib/arm/libxcrypto_java.so (xcrypto_java_dev_ctx_init+310)定位出在代码的那个位置出现的崩溃,在我们的程序中,崩溃的位置:
if (id != NULL) {

PJ_LOG(1, (THIS_FILE, “2 cardid = [%s]”, id));

}
然后再看fault addr 0xf8,说明你引用了一个非法的指针,然后再计算出指针的偏移为0xf8(十进制为248),然后在看id是来自哪个结构,我的程序中id来自这样的结构(为了保护公司隐私,这里形象写一下),id 是来自结构体A的id,结构体A如下:
struct A {
int pre;
int next
int type;
int rl;
int typeid;
char con[64];
char path[128];
uint8_t pin[32];
int pin_len;
char id[64];

stc sig;
stc ex;
unsigned  isused;

}
然后再看id在结构体A的偏移,突然发现id在结构体中的偏移正好是248,那么说明你引用了一个类型为结构体A的空指针,0k,问题已解决(项目中是由于多线程操作引起的)。
总结,简单粗暴的方法:拿到崩溃的地址,然后计算偏移,然后看一下结构的首地址

发布了16 篇原创文章 · 获赞 6 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41163331/article/details/87973283