碰到程序崩溃,无疑是程序员最不愿意面对,却又不得不面对的问题。特别是对于一些随机出现的崩溃问题,更是伤透了脑筋。android程序崩溃,让打印出一串让人摸不着头脑的调用堆栈信息。比如,ChromiumTestShell程序如果运行在单进程模式下,程序启动后就会立即崩溃,此时使用adb logcat命令可以看到如下信息:
F/libc ( 632): Fatal signal 11 (SIGSEGV) at 0×00000000 (code=1)
I/Process ( 78): Sending signal. PID: 632 SIG: 3
I/dalvikvm( 632): threadid=3: reacting to signal 3
I/dalvikvm( 632): Wrote stack traces to ‘/data/anr/traces.txt’
I/DEBUG ( 34): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 34): Build fingerprint: ‘generic/sdk/generic:4.0.4/MR1/302030:eng/test-keys’
I/DEBUG ( 34): pid: 632, tid: 632 >>> org.chromium.chrome.testshell <<<
I/DEBUG ( 34): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG ( 34): r0 00000000 r1 4ba0899c r2 4b94dac0 r3 00000000
I/DEBUG ( 34): r4 00126be0 r5 400535c8 r6 00000000 r7 4ba0899c
I/DEBUG ( 34): r8 bec48500 r9 44b96a7c 10 49539c89 fp bec48514
I/DEBUG ( 34): ip 4004c474 sp bec48378 lr 49a55051 pc 49a55050 cpsr 40000030
I/DEBUG ( 34): d0 0000009643160000 d1 3ff0000043160000
I/DEBUG ( 34): d2 bebbb26d0ce23302 d3 3f114faa5327caed
I/DEBUG ( 34): d4 bfd072cb157ea223 d5 000000a000000000
I/DEBUG ( 34): d6 000000a100000000 d7 000000003f800000
I/DEBUG ( 34): d8 0000000000000000 d9 0000000000000000
I/DEBUG ( 34): d10 0000000000000000 d11 0000000000000000
I/DEBUG ( 34): d12 0000000000000000 d13 0000000000000000
I/DEBUG ( 34): d14 0000000000000000 d15 0000000000000000
I/DEBUG ( 34): scr 60000012
I/DEBUG ( 34):
I/DEBUG ( 34): #00 pc 00401050 /data/data/org.chromium.chrome.testshell/lib/libchromiumtestshell.so
I/DEBUG ( 34): #01 pc 004010a8 /data/data/org.chromium.chrome.testshell/lib/libchromiumtestshell.so
I/DEBUG ( 34): #02 pc 0017e620 /data/data/org.chromium.chrome.testshell/lib/libchromiumtestshell.so
I/DEBUG ( 34): #03 pc 0001ec30 /system/lib/libdvm.so (dvmPlatformInvoke)
I/DEBUG ( 34): #04 pc 000590ce /system/lib/libdvm.so (_Z16dvmCallJNIMethodPKjP6JValuePK6MethodP6Thread)
I/DEBUG ( 34): #05 pc 0004cbe8 /system/lib/libdvm.so (_Z21dvmCheckCallJNIMethodPKjP6JValuePK6MethodP6Thread)
I/DEBUG ( 34): #06 pc 00030a4c /system/lib/libdvm.so
I/DEBUG ( 34): #07 pc 000341fc /system/lib/libdvm.so (_Z12dvmInterpretP6ThreadPK6MethodP6JValue)
I/DEBUG ( 34): #08 pc 0006c7be /system/lib/libdvm.so (_Z15dvmInvokeMethodP6ObjectPK6MethodP11ArrayObjectS5_P11ClassObjectb)
I/DEBUG ( 34): #09 pc 00073448 /system/lib/libdvm.so
I/DEBUG ( 34): #10 pc 00030a4c /system/lib/libdvm.so
I/DEBUG ( 34): #11 pc 000341fc /system/lib/libdvm.so (_Z12dvmInterpretP6ThreadPK6MethodP6JValue)
I/DEBUG ( 34): #12 pc 0006c7be /system/lib/libdvm.so (_Z15dvmInvokeMethodP6ObjectPK6MethodP11ArrayObjectS5_P11ClassObjectb)
I/DEBUG ( 34): #13 pc 00073bee /system/lib/libdvm.so
I/DEBUG ( 34): #14 pc 00030a4c /system/lib/libdvm.so
I/DEBUG ( 34): #15 pc 000341fc /system/lib/libdvm.so (_Z12dvmInterpretP6ThreadPK6MethodP6JValue)
I/DEBUG ( 34): #16 pc 0006ca8e /system/lib/libdvm.so (_Z14dvmCallMethodVP6ThreadPK6MethodP6ObjectbP6JValueSt9__va_list)
I/DEBUG ( 34): #17 pc 00055122 /system/lib/libdvm.so
I/DEBUG ( 34): #18 pc 00049ac4 /system/lib/libdvm.so
I/DEBUG ( 34): #19 pc 00042662 /system/lib/libandroid_runtime.so
I/DEBUG ( 34): #20 pc 000431ca /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime5startEPKcS2_)
I/DEBUG ( 34): #21 pc 00008f0e /system/bin/app_process
I/DEBUG ( 34): #22 pc 00016740 /system/lib/libc.so (__libc_init)
I/DEBUG ( 34):
I/DEBUG ( 34): code around pc:
I/DEBUG ( 34): 49a55030 2304227a 4479a801 fda2f733 a8024914 z".#..yD3….I..
I/DEBUG ( 34): 49a55040 f57c4479 a801fffc fb54f733 f2def021 yD|…..3.T.!…
I/DEBUG ( 34): 49a55050 f8d36803 479830f4 6a1b6803 46064798 .h…0.G.h.j.G.F
I/DEBUG ( 34): 49a55060 428668a0 b110d004 685b6803 60a64798 .h.B…..h[h.G.`
I/DEBUG ( 34): 49a55070 46209a29 429a682b f57bd001 b02becbe ). F+h.B..{...+.
I/DEBUG ( 34):
I/DEBUG ( 34): code around lr:
I/DEBUG ( 34): 49a55030 2304227a 4479a801 fda2f733 a8024914 z".#..yD3....I..
I/DEBUG ( 34): 49a55040 f57c4479 a801fffc fb54f733 f2def021 yD|.....3.T.!...
I/DEBUG ( 34): 49a55050 f8d36803 479830f4 6a1b6803 46064798 .h...0.G.h.j.G.F
I/DEBUG ( 34): 49a55060 428668a0 b110d004 685b6803 60a64798 .h.B.....h[h.G.`
I/DEBUG ( 34): 49a55070 46209a29 429a682b f57bd001 b02becbe ). F+h.B..{...+.
I/DEBUG ( 34):
I/DEBUG ( 34): stack:
I/DEBUG ( 34): bec48338 00000000
I/DEBUG ( 34): bec4833c 00000000
I/DEBUG ( 34): bec48340 00000000
I/DEBUG ( 34): bec48344 00000000
I/DEBUG ( 34): bec48348 00000006
I/DEBUG ( 34): bec4834c 00000000
I/DEBUG ( 34): bec48350 4ba2fac8
I/DEBUG ( 34): bec48354 00000000
I/DEBUG ( 34): bec48358 00000000
I/DEBUG ( 34): bec4835c 00000000
I/DEBUG ( 34): bec48360 00000000
I/DEBUG ( 34): bec48364 00000000
I/DEBUG ( 34): bec48368 00000000
I/DEBUG ( 34): bec4836c 7d0c0000
I/DEBUG ( 34): bec48370 df0027ad
I/DEBUG ( 34): bec48374 00000000
I/DEBUG ( 34): #00 bec48378 4ba0899c /data/data/org.chromium.chrome.testshell/lib/libchromiumtestshell.so
I/DEBUG ( 34): bec4837c 499a079b /data/data/org.chromium.chrome.testshell/lib/libchromiumtestshell.so
I/DEBUG ( 34): bec48380 0000002a
I/DEBUG ( 34): bec48384 4aae9427 /data/data/org.chromium.chrome.testshell/lib/libchromiumtestshell.so
I/DEBUG ( 34): bec48388 00000065
I/DEBUG ( 34): bec4838c 494e45dc /data/app/org.chromium.chrome.testshell-1.apk
I/DEBUG ( 34): bec48390 4086df90 /system/lib/libdvm.so
I/DEBUG ( 34): bec48394 412ea658 /dev/ashmem/dalvik-heap (deleted)
I/DEBUG ( 34): bec48398 40872fb8 /system/lib/libdvm.so
I/DEBUG ( 34): bec4839c 409e3910 /dev/ashmem/dalvik-heap (deleted)
I/DEBUG ( 34): bec483a0 40872c58 /system/lib/libdvm.so
I/DEBUG ( 34): bec483a4 40810bb5 /system/lib/libdvm.so
I/DEBUG ( 34): bec483a8 00000000
I/DEBUG ( 34): bec483ac b28ecf10
I/DEBUG ( 34): bec483b0 00186220 [heap]
I/DEBUG ( 34): bec483b4 409e3920 /dev/ashmem/dalvik-heap (deleted)
I/DEBUG ( 34): bec483b8 0000f2c0 [heap]
I/DEBUG ( 34): bec483bc 8040001d
I/DEBUG ( 34): bec483c0 40810bb5 /system/lib/libdvm.so
I/DEBUG ( 34): bec483c4 00000000
I/DEBUG ( 34): bec483c8 00000004
I/DEBUG ( 34): bec483cc 00186220 [heap]
I/DEBUG ( 34): bec483d0 4004c4c0
I/DEBUG ( 34): bec483d4 4004c4c0
I/DEBUG ( 34): bec483d8 00126be0 [heap]
I/DEBUG ( 34): bec483dc 00126c00 [heap]
I/DEBUG ( 34): bec483e0 bec48500 [stack]
I/DEBUG ( 34): bec483e4 4004c498
I/DEBUG ( 34): bec483e8 49539c89 /data/dalvik-cache/data@[email protected]@classes.dex
I/DEBUG ( 34): bec483ec 40018c39 /system/lib/libc.so
I/DEBUG ( 34): bec483f0 00000001
I/DEBUG ( 34): bec483f4 0000f2c0 [heap]
I/DEBUG ( 34): bec483f8 40864efe /system/lib/libdvm.so
I/DEBUG ( 34): bec483fc 00000007
I/DEBUG ( 34): bec48400 0000f201 [heap]
I/DEBUG ( 34): bec48404 10000000
I/DEBUG ( 34): bec48408 408030fd /system/lib/libdvm.so
I/DEBUG ( 34): bec4840c 4ba0899c /data/data/org.chromium.chrome.testshell/lib/libchromiumtestshell.so
I/DEBUG ( 34): bec48410 4ba0899c /data/data/org.chromium.chrome.testshell/lib/libchromiumtestshell.so
I/DEBUG ( 34): bec48414 00000000
I/DEBUG ( 34): bec48418 44b96a84
I/DEBUG ( 34): bec4841c b28ecf10
I/DEBUG ( 34): bec48420 44b96a7c
I/DEBUG ( 34): bec48424 00126be0 [heap]
I/DEBUG ( 34): bec48428 4ba0899c /data/data/org.chromium.chrome.testshell/lib/libchromiumtestshell.so
I/DEBUG ( 34): bec4842c 00000000
I/DEBUG ( 34): bec48430 44b96a84
I/DEBUG ( 34): bec48434 49a550ad /data/data/org.chromium.chrome.testshell/lib/libchromiumtestshell.so
I/DEBUG ( 34): #01 bec48438 b28ecf10
I/DEBUG ( 34): bec4843c 400535c8
I/DEBUG ( 34): bec48440 4ba0899c /data/data/org.chromium.chrome.testshell/lib/libchromiumtestshell.so
I/DEBUG ( 34): bec48444 497d2625 /data/data/org.chromium.chrome.testshell/lib/libchromiumtestshell.so
非常悲剧的是,打印的调用堆栈只有地址,并没有函数名和代码行。为了解决这一问题,android NDK工具链提供了arm-linux-androideabi-addr2line,通过这一命令,可以找到对应的函数名和代码行。首先,在上面找到崩溃是的地址,可以看到I/DEBUG ( 34): #00 pc 下面的一行
00401050 /data/data/org.chromium.chrome.testshell/lib/libchromiumtestshell.so
从而知道崩溃时的地址为00401050,然后执行如下命令
$ arm-linux-androideabi-addr2line -f -C -e out/Debug/lib.target/libchromiumtestshell.so 00401050
结果如下:
00401050
CompositorImpl
/home/alex/myprojects/c4a/chrome/src/content/browser/renderer_host/compositor_impl_android.cc:124