linux运行崩溃怎么定位,Linux 程序崩溃定位

栈帧信息

(gdb) info frame

Stack level 0, frame at 0x7ffc286552a0:

rip = 0x55943b2bb8c4 in foo; saved rip = 0x55943b2bb9e9

called by frame at 0x7ffc28655300

Arglist at 0x7ffc28655290, args:

Locals at 0x7ffc28655290, Previous frame's sp is 0x7ffc286552a0

Saved registers:

rbp at 0x7ffc28655290, rip at 0x7ffc28655298

进程maps 信息

/proc/11742/maps

---

55943b2bb000-55943b2bc000 r-xp 00000000 08:0a 5772372 /home/xxx/tests/c/gdb/a.out

55943b4bb000-55943b4bc000 r--p 00000000 08:0a 5772372 /home/xxx/tests/c/gdb/a.out

55943b4bc000-55943b4bd000 rw-p 00001000 08:0a 5772372 /home/xxx/tests/c/gdb/a.out

55943b9a8000-55943b9c9000 rw-p 00000000 00:00 0 [heap]

7f4e8b87a000-7f4e8ba50000 r-xp 00000000 08:09 523649 /lib/x86_64-linux-gnu/libc-2.26.so

7f4e8ba50000-7f4e8bc50000 ---p 001d6000 08:09 523649 /lib/x86_64-linux-gnu/libc-2.26.so

7f4e8bc50000-7f4e8bc54000 r--p 001d6000 08:09 523649 /lib/x86_64-linux-gnu/libc-2.26.so

7f4e8bc54000-7f4e8bc56000 rw-p 001da000 08:09 523649 /lib/x86_64-linux-gnu/libc-2.26.so

7f4e8bc56000-7f4e8bc5a000 rw-p 00000000 00:00 0

7f4e8bc5a000-7f4e8bc81000 r-xp 00000000 08:09 523292 /lib/x86_64-linux-gnu/ld-2.26.so

7f4e8be51000-7f4e8be54000 rw-p 00000000 00:00 0

7f4e8be7e000-7f4e8be81000 rw-p 00000000 00:00 0

7f4e8be81000-7f4e8be82000 r--p 00027000 08:09 523292 /lib/x86_64-linux-gnu/ld-2.26.so

7f4e8be82000-7f4e8be83000 rw-p 00028000 08:09 523292 /lib/x86_64-linux-gnu/ld-2.26.so

7f4e8be83000-7f4e8be84000 rw-p 00000000 00:00 0

7ffc28637000-7ffc28658000 rw-p 00000000 00:00 0 [stack]

7ffc286aa000-7ffc286ad000 r--p 00000000 00:00 0 [vvar]

7ffc286ad000-7ffc286af000 r-xp 00000000 00:00 0 [vdso]

ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

计算

rip 指向a.out 的 .text 段 r-xp

rip - a.out .text 段基址 = 0x55943b2bb8c4 - 0x55943b2bb000 = 0x8c4

objdump

objdump -ds a.out > a.txt

00000000000008a0 :

8a0: 55 push %rbp

8a1: 48 89 e5 mov %rsp,%rbp

8a4: 5d pop %rbp

8a5: e9 66 ff ff ff jmpq 810

00000000000008aa :

8aa: 55 push %rbp

8ab: 48 89 e5 mov %rsp,%rbp

8ae: 48 89 7d e8 mov %rdi,-0x18(%rbp)

8b2: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp)

8b9: c7 45 fc 03 00 00 00 movl $0x3,-0x4(%rbp)

8c0: 48 8b 45 e8 mov -0x18(%rbp),%rax

8c4: 8b 00 mov (%rax),%eax

8c6: 89 45 fc mov %eax,-0x4(%rbp)

8c9: 90 nop

8ca: 5d pop %rbp

8cb: c3 retq

00000000000008cc :

8cc: 55 push %rbp

8cd: 48 89 e5 mov %rsp,%rbp

8d0: 48 83 ec 50 sub $0x50,%rsp

...

a.c 的内容:

void foo(int *p)

{

int a = 0;

a = 1 + 2;

a = *p;

}

int main()

{

...

foo(0);

...

}

定位

0x8c4 即foo函数中 mov (%rax),%eax 对应的a = *p; 一句。完成!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值