開發過程中內存崩潰分析(: 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,問題已解決(項目中是由於多線程操作引起的)。
總結,簡單粗暴的方法:拿到崩潰的地址,然後計算偏移,然後看一下結構的首地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章