adb shell cat /proc/pid/maps |gawk '$2~/r-xp/{print "0x"substr($1,1,8),"0x"substr($1,10,8), $6}'
将之保存到maps.txt文件
cat maps.txt |awk '{addr=strtonum(addr2);beg=strtonum($1);end=strtonum($2);if(addr>=beg&&addr<=end){printf "0x%0x %s\n",addr-beg,$3}}' addr2="0x"$1|awk '{system("arm-eabi-addr2l
ine -f -e out/target/product/ua8200/symbols"$2" "$1)}'
将以上脚本保存到test.sh
若得到stack back trace 如下:
E/libc ( 1537): *** FREE CHECK: buffer 0x684d30 corrupted 16 bytes before allocation
E/libc ( 1537): call stack:
E/libc ( 1537): 0: 8000dbd2
E/libc ( 1537): 1: 8000dc80
E/libc ( 1537): 2: 8000dcc4
E/libc ( 1537): 3: 8000dd20
E/libc ( 1537): 4: afd144ec
E/libc ( 1537): 5: afc009c6
E/libc ( 1537): 6: a8114a56
E/libc ( 1537): 7: ac51de58
E/libc ( 1537): 8: ac51df74
E/libc ( 1537): 9: ac51d168
E/libc ( 1537): 10: ac51d184
E/libc ( 1537): 11: ac524fea
E/libc ( 1537): 12: ac526160
E/libc ( 1537): 13: a811c662
E/libc ( 1537): 14: a811cbc0
E/libc ( 1537): 15: afd118f8
E/libc ( 1537): 16: afd114c4
将其中的stack部分保存为backtrace.txt
运行awk '{system("test.sh "$5)}' back trace.txt
可得
get_backtrace
/home/sw/xgm/msm7x30/gingerbread/bionic/libc/bionic/malloc_debug_leak.c:258
assert_log_message
/home/sw/xgm/msm7x30/gingerbread/bionic/libc/bionic/malloc_debug_leak.c:308
chk_mem_check
/home/sw/xgm/msm7x30/gingerbread/bionic/libc/bionic/malloc_debug_leak.c:344
chk_free
/home/sw/xgm/msm7x30/gingerbread/bionic/libc/bionic/malloc_debug_leak.c:392
free
/home/sw/xgm/msm7x30/gingerbread/bionic/libc/bionic/malloc_debug_common.c:225
_ZdlPv
/home/sw/xgm/msm7x30/gingerbread/bionic/libstdc++/src/new.cpp:27
~RefBase
/home/sw/xgm/msm7x30/gingerbread/frameworks/base/libs/utils/RefBase.cpp:534
_ZN7android6Thread11_threadLoopEPv
/home/sw/xgm/msm7x30/gingerbread/frameworks/base/libs/utils/Threads.cpp:773
_ZN13thread_data_t10trampolineEPKS_
/home/sw/xgm/msm7x30/gingerbread/frameworks/base/libs/utils/Threads.cpp:128
__thread_entry
/home/sw/xgm/msm7x30/gingerbread/bionic/libc/bionic/pthread.c:208
pthread_create
/home/sw/xgm/msm7x30/gingerbread/bionic/libc/bionic/pthread.c:348