有时候我们出现的软重启问题,只有段错误,只给你一个错误地址,没有具体信息,像这种问题我们应该怎么分析呢:
我们先举个例子:
...F DEBUG : pid: 11028, tid: 11046, name: android.bg >>> system_server <<<
...E DEBUG : AM write failed: Broken pipe
03-15 10:53:31.636570 8989 8989 F DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
03-15 10:53:31.691722 8989 8989 F DEBUG : r0 afef2038 r1 00000001 r2 00000001 r3 0000001c
03-15 10:53:31.691869 8989 8989 F DEBUG : r4 a24f74a0 r5 00000000 r6 afef2038 r7 abffdcc0
03-15 10:53:31.691947 8989 8989 F DEBUG : r8 00000001 r9 adc55600 sl 00000000 fp 12fed3c0
03-15 10:53:31.692033 8989 8989 F DEBUG : ip 12fed3dc sp a24f7478 lr b3ee05a1 pc 00000000 cpsr 600f0010
03-15 10:53:31.695701 8989 8989 F DEBUG :
...F DEBUG : backtrace:
...8989 8989 F DEBUG : #00 pc 00000000 <unknown>
...8989 8989 F DEBUG : #01 pc 0001359f /system/lib/libandroid_servers.so
...8989 8989 F DEBUG : #02 pc 00c05d1d /data/dalvik-cache/arm/system@framework@services.jar@classes.dex (offset 0x7cb000)
像这个问题0001359f这个地址出错了,因为它的下个地址为0,说明空指针了,当然导致调用出错了。最后导致system_server重启
像这种问题我们应该怎么解决呢?
我们应该使用addr2line这个工具,将001359f这个地址找到对应的代码,这个时候就需要符号表。
addr2line -e out/target/product/lte26007/symbols/system/lib/libandroid_servers.so -f 0001359f
具体如何使用addr2line可以使用man addr2line来查询
这样我们就有如下结果:
frameworks/base/services/core/jni/com_android_server_location_GpsLocationProvider.cpp:762
就知道了具体出错在哪里了。