vc66vcc
2016-06-17 02:06linux 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条回答
为你推荐
- 使用cgo和不使用cgo进行编译时,golang使用的汇编程序
- cgo
- assembly
- package
- gcc
- 1个回答
- Linux下反汇编C语言程序,其中有个匿名的且非常简短的函数,通过分析发现这个函数好像没有任何意义?
- linux
- c语言
- ubuntu
- 1个回答
- 汇编语言跟C语言的简单转化
- c语言
- c++
- 1个回答
- ILDASM反编译提示受保护的模块 无法进行反汇编
- 反编译
- ildasm
- c#
- 1个回答
- linux 汇编完整语法介绍
- 汇编语言
- 2个回答