生产服务器怎么dmp堆栈信息,core文件无堆栈信息定位的思路

(gdb) disas caller

Dump of assembler code for function caller():

0x0000000000400857 :push   %rbp

0x0000000000400858 :mov    %rsp,%rbp

0x000000000040085b :mov    $0x14,%edi

0x0000000000400860 :callq  0x400804

0x0000000000400865 :mov    $0x4009fc,%esi

0x000000000040086a :mov    $0x601060,%edi

0x000000000040086f :callq  0x4006f0 <_zstlsist11char_traitsiceerst13basic_ostreamict_es5_pkc>

0x0000000000400874 :mov    $0x400710,%esi

0x0000000000400879 :mov    %rax,%rdi

0x000000000040087c :callq  0x400700 <_znsolsepfrsos_e>

0x0000000000400881 :pop    %rbp

0x0000000000400882 :retq

(gdb) disas main

Dump of assembler code for function main():

0x0000000000400883 : push   %rbp

0x0000000000400884 : mov    %rsp,%rbp

0x0000000000400887 : callq  0x400857

0x000000000040088c : mov    $0x400a03,%esi

0x0000000000400891 : mov    $0x601060,%edi

0x0000000000400896 : callq  0x4006f0 <_zstlsist11char_traitsiceerst13basic_ostreamict_es5_pkc>

0x000000000040089b : mov    $0x400710,%esi

0x00000000004008a0 : mov    %rax,%rdi

0x00000000004008a3 : callq  0x400700 <_znsolsepfrsos_e>

0x00000000004008a8 : mov    $0x0,%eax

0x00000000004008ad : pop    %rbp

0x00000000004008ae : retq

根据$rbp表明,当前实际应该是执行到了 main()函数的0x000000000040088c : mov    $0x400a03,%esi的上一条指令(caller()函数)

的0x0000000000400865 :mov    $0x4009fc,%esi的上一条0x0000000000400860 :callq  0x400804 中。

在coredump以后。

------------------------------------------------------

(gdb) info register

rax            0x7fffffffe518 140737488348440

rbx            0x0 0

rcx            0x7ffff77fd910 140737345739024

rdx            0x0 0

rsi            0x7ffff7ad1ab0 140737348704944

rdi            0x7ffff7ad0260 140737348698720

rbp            0x400000003 0x400000003

rsp            0x7fffffffe520 0x7fffffffe520

r8             0x7ffff7202740 140737339467584

r9             0x7ffff7202740 140737339467584

r10            0x7fffffffe280 140737488347776

r11            0x7ffff7785c90 140737345248400

r12            0x400720 4196128

r13            0x7fffffffe610 140737488348688

r14            0x0 0

r15            0x0 0

rip            0x4 0x4

eflags         0x216 [ PF AF IF ]

cs             0x33 51

ss             0x2b 43

ds             0x0 0

es             0x0 0

fs             0x0 0

gs             0x0 0

------------------------------------------------------

根据core文件的寄存器信息,可知,bp及ip均已写飞。只能利用sp指针来查询。

------------------------------------------------------

(gdb) x/32ux $rsp

0x7fffffffe520: 0xffffe530 0x00007fff 0x0040088c 0x00000000

(gdb) x/i 0x0040088c

0x40088c : mov    $0x400a03,%esi

(gdb) disas main

Dump of assembler code for function main():

0x0000000000400883 : push   %rbp

0x0000000000400884 : mov    %rsp,%rbp

0x0000000000400887 : callq  0x400857

0x000000000040088c : mov    $0x400a03,%esi

------------------------------------------------------

由此,可以查出是core在了main函数中。

例子使用的最简单的,实际测试时,会有多层调用,但是原理不变。

限制:如果越界的长度超过了函数调用堆栈的长度,本方法则不再可用。

以后补个图。今天就到这里了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值