vc66vcc
vc66vcc
2016-06-17 02:06

linux C程序反汇编 定位异常时 关于PC指针和流水线的疑问

20

在c语言空指针操作的时候,oops定位异常,常常使用oops中打印的pc指针。

直接使用addr2line 的话,就能定位到空指针操作的行数。
如果使用objdump的话也能利用pc指针直接定位到反汇编空指针操作所在的地址。

这些都没有问题。

如果是arm 32位芯片的话一般有三级流水或者5级流水的话,前三步流水都是 取指->译码->执行 , pc指针是指在取指的位置,一般来说 PC - 8 才是执行的位置。

空指针操作 异常应该是执行时才出的问题吧,为什么反汇编时 反而是PC指向了空指针操作的那句汇编。
PC不是取指吗,难道空指针操作取指的时候就会判断错误吗?如果不是这样的话,执行流水应该还在PC-8的位置啊。
怎么理解跪求解答。

一段小源码
#include

int add_f(int i)
{
i = i + 1;
return i;
}

int main()
{
int i =10;
int *p = NULL;

*p = add_f(i);

return 0;

}

执行时异常pc值打印
SP = 0xbef23ce8 FP = 0xbef23cf4 IP = 0xb6ed6000 LR = 0x0000840c PC = 0x00008414
CPSR = 0x60000010
access: [Write], addr = 0x00000000

r0 = 0x0000000b r1 = 0xbef23e44 r2 = 0x0000000b

r3 = 0x00000000 r4 = 0x00000000 r5 = 0x00000000

r6 = 0x00008294 r7 = 0x00000000 r8 = 0x00000000

r9 = 0x00000000 r10 = 0xb6f01000 r11 = 0xbef23cf4

r12 = 0xb6ed6000 r13 = 0xbef23ce8 r14 = 0x0000840c

r15 = 0x00008414 r16 = 0x60000010 r17 = 0xffffffff

反汇编
#include

int add_f(int i)
{
83b8: e52db004 push {fp} ; (str fp, [sp, #-4]!)
83bc: e28db000 add fp, sp, #0
83c0: e24dd00c sub sp, sp, #12
83c4: e50b0008 str r0, [fp, #-8]
i = i + 1;
83c8: e51b3008 ldr r3, [fp, #-8]
83cc: e2833001 add r3, r3, #1
83d0: e50b3008 str r3, [fp, #-8]
return i;
83d4: e51b3008 ldr r3, [fp, #-8]
}
83d8: e1a00003 mov r0, r3
83dc: e24bd000 sub sp, fp, #0
83e0: e49db004 pop {fp} ; (ldr fp, [sp], #4)
83e4: e12fff1e bx lr

000083e8 :

int main()
{
83e8: e92d4800 push {fp, lr}
83ec: e28db004 add fp, sp, #4
83f0: e24dd008 sub sp, sp, #8
int i =10;
83f4: e3a0300a mov r3, #10
83f8: e50b3008 str r3, [fp, #-8]
int *p = NULL;
83fc: e3a03000 mov r3, #0
8400: e50b300c str r3, [fp, #-12]

*p = add_f(i);
8404:   e51b0008    ldr r0, [fp, #-8]
8408:   ebffffea    bl  83b8 <add_f>
840c:   e1a02000    mov r2, r0
8410:   e51b300c    ldr r3, [fp, #-12]
8414:   e5832000    str r2, [r3]

return 0;
8418:   e3a03000    mov r3, #0
841c:   e1a00003    mov r0, r3
8420:   e24bd004    sub sp, fp, #4
8424:   e8bd8800    pop {fp, pc}
  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

1条回答