转载请说明出处。
1.异常调试信息内容
以下信息基于MIPS处理器的Android应用程序产生异常时的信息:
signal 8 (SIGFPE), fault addr 5110d61c
zr 00000000 at 30000400 v0 00000000 v1 00000000
a0 00000000 a1 00000000 a2 32973668 a3 00000000
t0 00000000 t1 3037e7a8 t2 00000000 t3 fffffff4
t4 5154bd58 t5 4ca5cd9a t6 00000028 t7 00000008
s0 00000001 s1 31879008 s2 5156a6d0 s3 00000000
s4 00000001 s5 51460328 s6 51250000 s7 5145ff90
t8 00000000 t9 5110d604 k0 00000024 k1 00000000
gp 51463110 sp 3037e7b0 s8 5145ff4a ra 5110f708
hi 00000000 lo 00000000 bva 511f975c epc 5110d61c
#00 pc 5110d61c /data/data/com.mainframe/lib/test.so
#01 ra 5110f708 /data/data/com.mainframe/lib/test.so
code around pc:
5110d60c 00431023 00441021 00021080 0045001b
5110d61c 00a001f4 03e00008 00001012 3c1c0035
5110d62c 279c5ae8 0399e021 8f828070 03e00008
code around lr:
5110f6f8 ac620000 8e240028 0320f809 8e250018
5110f708 8fbc0010 ae420000 8f82b874 24030001
5110f718 ac430000 8f92bddc 3c026666 8e45002c
2.异常调试信息解析:
其中:
“#00 pc 511150d0 /data/data/com.test/lib/test.so”表示当前程序指针寄存器pc的值指向的代码处于“/data/data/com.mainframe/lib/test.so”动态库,
“#01 ra 5110f708 /data/data/com.mainframe/lib/test.so”表示返回地址指针(也是链接寄存器lr中的值)的位置处于“/data/data/com.mainframe/lib/test.so”动态库,
通常认为:
异常是由“#01 ra 5110f708 /data/data/com.mainframe/lib/test.so”一行中指出的地址是产生的异常代码,这里说明,出现异常的地址是:5110f708
3.反汇编方法
mips-linux-gnu-objdump -Dz data/data/com.mainframe/lib/test.so > test.dump
test.dump就是反汇编代码。
4.如何通过栈历史信息定位的代码
例如:
"
code around pc:
5110d60c 00431023 00441021 00021080 0045001b
5110d61c 00a001f4 03e00008 00001012 3c1c0035
5110d62c 279c5ae8 0399e021 8f828070 03e00008
"
地址:5110d60c,5110d61c ,5110d62c 应该是虚拟地址,没有分析意义,同样的代码产生异常的时候,这三个地址可能不相同。
这三个地址中,跟在每个地址后面的那4个地址才是真正的可执行代码的地址,所以要对这4 x 3 =12个地址进行查找。
上面的PC历史信息说明了一系列的代码调用,它代表的是12行反汇编代码,而且这些代码在某个函数中是被连续调用的。
通过查找匹配,定位到的函数为:
0010d604 <function1>:
10d604: 00041880 sll v1,a0,0x2
10d608: 000411c0 sll v0,a0,0x7
10d60c: 00431023 subu v0,v0,v1
10d610: 00441021 addu v0,v0,a0
10d614: 00021080 sll v0,v0,0x2
10d618: 0045001b divu zero,v0,a1
10d61c: 00a001f4 teq a1,zero,0x7
10d620: 03e00008 jr ra
10d624: 00001012 mflo v0
0010d628 <function2>:
10d628: 3c1c0035 lui gp,0x35
10d62c: 279c5ae8 addiu gp,gp,23272
10d630: 0399e021 addu gp,gp,t9
10d634: 8f828070 lw v0,-32656(gp)
10d638: 03e00008 jr ra
10d63c: ac443478 sw a0,13432(v0)
上面加黑的地址对应的就是PC历史中指出的12个连接调用的地址。
仔细一看,发现定位后的函数有function1、function2两个,我个人认为,程序中是这样调用的:
function1();
function2();
因此在代码段装载的时候,他们是连接被载入流水线中的,这一观点可以在汇编代码左边的虚拟内存地址可以看出来,他们是连续的。
5.如何通过栈历史信息定位产生异常的代码
我们可以通过以上信息从反汇编文件中定位产生异常的代码,由于产生异常的地址一般是链接寄存器的值,所以我们重点分析:
“
code around lr:
5110f6f8 ac620000 8e240028 0320f809 8e250018
5110f708 8fbc0010 ae420000 8f82b874 24030001
5110f718 ac430000 8f92bddc 3c026666 8e45002c
”
要在庞大反汇编文件中找到12个连续调用的地址:
ac620000 8e240028 0320f809 8e250018
8fbc0010 ae420000 8f82b874 24030001
ac430000 8f92bddc 3c026666 8e45002c
并不是一件容易的事,你可以根据反汇编文件的内容格式写个小程序让电脑帮你找。
经过仔细匹配查找,最终定位代码:
0010f690 <PlayWave>:
10f690: 3c1c0035 lui gp,0x35
10f694: 279c3a80 addiu gp,gp,14976
10f698: 0399e021 addu gp,gp,t9
10f69c: 27bdffd0 addiu sp,sp,-48
10f6a0: afbf002c sw ra,44(sp)
10f6a4: afb40028 sw s4,40(sp)
10f6a8: afb30024 sw s3,36(sp)
10f6ac: afb20020 sw s2,32(sp)
10f6b0: afb1001c sw s1,28(sp)
10f6b4: afb00018 sw s0,24(sp)
10f6b8: afbc0010 sw gp,16(sp)
10f6bc: 00c08021 move s0,a2
10f6c0: 00808821 move s1,a0
10f6c4: 18c00031 blez a2,10f78c <PlayWave+0xfc>
10f6c8: 00a0a021 move s4,a1
10f6cc: 18e0002f blez a3,10f78c <PlayWave+0xfc>
10f6d0: 8f92a91c lw s2,-22244(gp)
10f6d4: 24020bb8 li v0,3000
10f6d8: 10c20010 beq a2,v0,10f71c <PlayWave+0x8c>
10f6dc: 8e530000 lw s3,0(s2)
10f6e0: 8f99ba08 lw t9,-17912(gp)
10f6e4: 0320f809 jalr t9
10f6e8: 00000000 nop
10f6ec: 8fbc0010 lw gp,16(sp)
10f6f0: 8f83cc08 lw v1,-13304(gp)
10f6f4: 8f99a188 lw t9,-24184(gp)
10f6f8: ac620000 sw v0,0(v1)
10f6fc: 8e240028 lw a0,40(s1)
10f700: 0320f809 jalr t9
10f704: 8e250018 lw a1,24(s1)
10f708: 8fbc0010 lw gp,16(sp)
10f70c: ae420000 sw v0,0(s2)
10f710: 8f82b874 lw v0,-18316(gp)
10f714: 24030001 li v1,1
10f718: ac430000 sw v1,0(v0)
10f71c: 8f92bddc lw s2,-16932(gp)
10f720: 3c026666 lui v0,0x6666
10f724: 8e45002c lw a1,44(s2)
10f728: 34426667 ori v0,v0,0x6667
10f72c: 00a20018 mult a1,v0
10f730: 000537c3 sra a2,a1,0x1f
10f734: 00001810 mfhi v1
10f738: 24a5ffff addiu a1,a1,-1
10f73c: 00032083 sra a0,v1,0x2
10f740: 00862023 subu a0,a0,a2
10f744: 000410c0 sll v0,a0,0x3
10f748: 00042040 sll a0,a0,0x1
10f74c: 00822021 addu a0,a0,v0
10f750: 10850035 beq a0,a1,10f828 <PlayWave+0x198>
10f754: 24020bb8 li v0,3000
10f758: 8e430088 lw v1,136(s2)
10f75c: 24020001 li v0,1
10f760: 10620004 beq v1,v0,10f774 <PlayWave+0xe4>
10f764: 24020bb8 li v0,3000
10f768: 14600023 bnez v1,10f7f8 <PlayWave+0x168>
10f76c: 24020002 li v0,2
10f770: 24020bb8 li v0,3000
10f774: 12020032 beq s0,v0,10f840 <PlayWave+0x1b0>
10f778: 8f999334 lw t9,-27852(gp)
10f77c: 02202021 move a0,s1
10f780: 0320f809 jalr t9
10f784: 00002821 move a1,zero
10f788: 8fbc0010 lw gp,16(sp)
10f78c: 24020001 li v0,1
10f790: 12820008 beq s4,v0,10f7b4 <PlayWave+0x124>
10f794: 8fbf002c lw ra,44(sp)
10f798: 8fb40028 lw s4,40(sp)
10f79c: 8fb30024 lw s3,36(sp)
10f7a0: 8fb20020 lw s2,32(sp)
10f7a4: 8fb1001c lw s1,28(sp)
10f7a8: 8fb00018 lw s0,24(sp)
10f7ac: 03e00008 jr ra
10f7b0: 27bd0030 addiu sp,sp,48
10f7b4: 8f84805c lw a0,-32676(gp)
10f7b8: 3c028000 lui v0,0x8000
10f7bc: 8483c39c lh v1,-15460(a0)
10f7c0: 34420001 ori v0,v0,0x1
10f7c4: 24630001 addiu v1,v1,1
10f7c8: 00621824 and v1,v1,v0
10f7cc: 04600011 bltz v1,10f814 <PlayWave+0x184>
10f7d0: 2402fffe li v0,-2
10f7d4: a483c39c sh v1,-15460(a0)
10f7d8: 8fbf002c lw ra,44(sp)
10f7dc: 8fb40028 lw s4,40(sp)
10f7e0: 8fb30024 lw s3,36(sp)
10f7e4: 8fb20020 lw s2,32(sp)
10f7e8: 8fb1001c lw s1,28(sp)
10f7ec: 8fb00018 lw s0,24(sp)
10f7f0: 03e00008 jr ra
10f7f4: 27bd0030 addiu sp,sp,48
10f7f8: 1462ffe5 bne v1,v0,10f790 <PlayWave+0x100>
10f7fc: 24020001 li v0,1
10f800: 24020bb8 li v0,3000
10f804: 1202ffe2 beq s0,v0,10f790 <PlayWave+0x100>
10f808: 24020001 li v0,1
10f80c: 1000ffdb b 10f77c <PlayWave+0xec>
10f810: 8f999334 lw t9,-27852(gp)
10f814: 2463ffff addiu v1,v1,-1
10f818: 00621825 or v1,v1,v0
10f81c: 24630001 addiu v1,v1,1
10f820: 1000ffed b 10f7d8 <PlayWave+0x148>
10f824: a483c39c sh v1,-15460(a0)
10f828: 1202ffcb beq s0,v0,10f758 <PlayWave+0xc8>
10f82c: 8f999f34 lw t9,-24780(gp)
10f830: 0320f809 jalr t9
10f834: 02602021 move a0,s3
10f838: 1000ffc7 b 10f758 <PlayWave+0xc8>
10f83c: 8fbc0010 lw gp,16(sp)
10f840: 02202021 move a0,s1
10f844: 0320f809 jalr t9
10f848: 24050001 li a1,1
10f84c: 1000ffcf b 10f78c <PlayWave+0xfc>
10f850: 8fbc0010 lw gp,16(sp)
上面红色的部分(即地址为8fbc0010)应该就是产生异常的代码。
Tags:
Android异常信息解析,Android异常调试,Linux异常调用