ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年10月8日 星期一

找到 android core dump 的 位置

這一篇有說明如何從 core dump 找到當機的 source code:
http://kobablog.wordpress.com/2011/05/14/how-to-read-crash-dump-of-android/

大概就是..從 out/target/product/XXX/ 下的 symbols folder,有 not stripped version 的檔案。

利用 objdump 列出位址與 source code。
配合 core dump 的內容就可以找出來了。



馬上來照著做好了,sample 是會發生 core dump 的XXXX..
內容大概是.. I/DEBUG ( 2333): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000 I/DEBUG ( 2333): r0 bee91054 r1 00000000 r2 bee9105a r3 00000000 I/DEBUG ( 2333): r4 bee91030 r5 bee91054 r6 80204c50 r7 0000abd8 I/DEBUG ( 2333): r8 bee91288 r9 4850cc70 10 0000abd8 fp aca9f368 I/DEBUG ( 2333): ip 80204c7c sp bee91028 lr 80201ec9 pc afd20856 cpsr 60000030 I/DEBUG ( 2333): #00 pc 00020856 /system/lib/libc.so I/DEBUG ( 2333): #01 pc 00001ec4 /data/data/com.Xingtek/lib/libhashkey.so I/DEBUG ( 2333): #02 pc 00011e34 /system/lib/libdvm.so I/DEBUG ( 2333): #03 pc 000436e0 /system/lib/libdvm.so I/DEBUG ( 2333): #04 pc 00048e62 /system/lib/libdvm.so I/DEBUG ( 2333): #05 pc 00017034 /system/lib/libdvm.so I/DEBUG ( 2333): #06 pc 0001c0e4 /system/lib/libdvm.so I/DEBUG ( 2333): #07 pc 0001afdc /system/lib/libdvm.so I/DEBUG ( 2333): #08 pc 00059dde /system/lib/libdvm.so I/DEBUG ( 2333): #09 pc 00061b52 /system/lib/libdvm.so I/DEBUG ( 2333): #10 pc 00017034 /system/lib/libdvm.so I/DEBUG ( 2333): #11 pc 0001c0e4 /system/lib/libdvm.so I/DEBUG ( 2333): #12 pc 0001afdc /system/lib/libdvm.so I/DEBUG ( 2333): #13 pc 00059c40 /system/lib/libdvm.so I/DEBUG ( 2333): #14 pc 00046126 /system/lib/libdvm.so I/DEBUG ( 2333): #15 pc 0003194e /system/lib/libandroid_runtime.so I/DEBUG ( 2333): #16 pc 000327fa /system/lib/libandroid_runtime.so I/DEBUG ( 2333): #17 pc 00008cca /system/bin/app_process I/DEBUG ( 2333): #18 pc 00014b52 /system/lib/libc.so 所以去查一下 libc.so 的 20856 ..
用 arm-eabi-objdump -S libc.so 之後,找 20856:


可以看到是strcat( ) 中的... 20856: 5ccc ldrb r4, [r1, r3]
應該是 r1 是 00000000,也就是 strcat 的 pointer 有一個是 0導致。

去看一下 bionic/libc/string/strcat.c:

char * strcat(char *s, const char *append) { char *save = s; for (; *s; ++s); while ((*s++ = *append++) != '\0'); return(save); } 果然沒有檢查,
所以加上 null pointer 檢查。

奇怪的是,如果直接在 code 用 s, append 檢查,會被 optimize 掉,
所以要另開 function..
int isnotvalid(int a, int b) { if((a==0)||(b==0)) return 1; else return 0; } 然後在 strcat 壹開始用 isnotvalid( ) cheeck s, append 才不會被 optimize 掉,
兒這樣,那個 XingTek 的 apk 也可以執行了 (雖然沒值...)



附帶提一點(或許對其他人來說,已經是 common sense ..)

libc.so 好像是啟動就cache 住,所以用 adb sync 把修改過的 lib.so sync 到 target,再啟動XingTek app
他也不會使用新的 lib.so,

adb sync 玩 libc.so 後,要 system reboot 才行。

沒有留言:

標籤

網誌存檔