Android异常跟踪调试

转载请说明出处。

 

 

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异常调用

你可能感兴趣的:(Android异常跟踪调试)