您的位置:首页 > 其它

gdb 调试coredump文件中烂掉的栈帧的方法

2015-08-26 16:20 399 查看
gdb调试core文件,直接backtrace,然后查看用frame n切换栈帧。

info local可以查看当前栈的局部变量。对于烂掉的栈帧,可以参考如下文章来推测对应的符号。

注意编译时打开 -fstack-protector 和 -fstack-protector-all选项,避免栈帧被冲刷掉。

1.关于函数调用栈帧参考如下
http://blog.csdn.net/qiu265843468/article/details/17844419
2.linux下的AT&T汇编参考这篇
http://www.doc88.com/p-378141850932.html
3.函数的调用约定(主要是参数的传递顺序和堆栈清理部分)
http://blog.chinaunix.net/uid-23929779-id-149680.html
4.gdb 调试后info reg后参考如下几篇:
http://devpit.org/wiki/x86ManualBacktrace http://blog.csdn.net/tobyaries/article/details/8990949 http://blog.csdn.net/tobyaries/article/details/8990869 http://blog.chinaunix.net/uid-16459552-id-3328601.html
主要参考第一篇

5.gdb x的功能介绍
http://www.cnblogs.com/tekkaman/p/3506120.html
linux下按4个字节来显示,用x/2048xw addr即可。

举例子说明吧。

1.打开coredump的core文件生成

ulimit -c unlimited

2.运行程序,产生core文件。将获取到的core文件跟bin文件放在同一个文件夹下,然后打开gdb

gdb visMgr core.25090

3.输入bt命令,看到

(gdb) bt

#0  0x00ccc57f in tc_pvalloc (size=28) at src/tcmalloc.cc:1695

#1  0x00de8d06 in ?? ()

#2  0x0000001c in ?? ()

#3  0xb58cd518 in ?? ()

#4  0x00de9b11 in ?? ()

#5  0x0000000f in ?? ()

#6  0x00000000 in ?? ()

看到一堆0地址和??表明这个函数里的栈帧已经坏掉,无法看到当前执行到那个函数发生问题 。

4. info reg查看ebp的值

eax            0x24 36

ecx            0xfffe 65534

edx            0x24 36

ebx            0xcd8ff4 13471732

esp            0xb58cd490 0xb58cd490

ebp            0xb58cd4e8 0xb58cd4e8

esi            0x9eb15c0 166401472

edi            0xc 12

eip            0xccc57f 0xccc57f <tc_pvalloc+31>

eflags         0x210206 [ PF IF RF ID ]

cs             0x73 115

ss             0x7b 123

ds             0x7b 123

es             0x7b 123

fs             0x0 0

gs             0x33 51

5. 查看内存镜像的地址,反推栈帧

从上面的命令得知ebp的地址,用该命令查看内存镜像地址

x/2048xw 0xb58cd4e8

输出如下:

0xb58cd4e8: 0xb58cd508 0x00de8d06 0x0000001c 0xb58cd518

0xb58cd4f8: 0xb58cd538 0x00f21bf5 0x00e3dff4 0x0883085a

0xb58cd508: 0xb58cd548 0x00de9b11 0x0000000f 0x00000000

0xb58cd518: 0xb58cd5af 0x00000000 0x09ef829f 0x0104ac6b

0xb58cd528: 0xb58cd558 0x010548c0 0x09ef8040 0x09ef8000

0xb58cd538: 0xb58cd578 0x00e3dff4 0x0883085a 0xb58cd5a8

0xb58cd548: 0xb58cd568 0x00de9cf6 0x0883085a 0x08830869

0xb58cd558: 0xb58cd5af 0x0087ad00 0x00899ff4 0xb58cdb7c

0xb58cd568: 0xb58cd5c8 0x00885a2d 0xb58cd5a8 0x0883085a

0xb58cd578: 0xb58cd5af 0x00f1c382 0xb58cd5bc 0x00893109

0xb58cd588: 0xb58cd5a8 0x08532bf3 0xb58cdb94 0x00000003

0xb58cd598: 0x00000000 0x00000000 0x00893109 0x00000005

0xb58cd5a8: 0xb58cd5c8 0x08526f6d 0xb58cdb94 0x00000000

0xb58cd5b8: 0x00885a0b 0xb58cdb7c 0xb58cdb7c 0x00000011

0xb58cd5c8: 0xb58cd5e8 0x0851f996 0xb58cdb7c 0x0883085a

0xb58cd5d8: 0x0881c8ba 0x00f1a426 0xb58cdb7c 0xb58cdb7c

0xb58cd5e8: 0xb58cd658 0x0854bbc5 0xb58cdb7c 0x0883085a

0xb58cd5f8: 0x0881c8ba 0x0088cdee 0x09ef8040 0x00893109

0xb58cd608: 0x00000005 0x00000000 0x00000000 0x00000000

0xb58cd618: 0xb58cd638 0x09ef8000 0xb58cdb04 0x001edc66

0xb58cd628: 0x00000000 0x00218ff4 0xb58cd91c 0x09ed6630

0xb58cd638: 0xb58cd678 0x00213145 0x09ed6630 0x00002000

0xb58cd648: 0x00000000 0xb58cdb7c 0xb58cdb7c 0x00000011

0xb58cd658: 0xb58cd688 0x0853806b 0xb58cdb7c 0x089d0a88

0xb58cd668: 0xb58cdbd8 0x0000000a 0x0000001c 0x00000011

0xb58cd678: 0xb58cd6a8 0xb58cdbd8 0xb58cdb7c 0x0000001c

0xb58cd688: 0xb58cd6a8 0x0852a9fe 0xb58cdb7c 0x089d0a88

0xb58cd698: 0xb58cdbd8 0x00000001 0x0000000a 0x0000000a

0xb58cd6a8: 0xb58ddd88 0x0851cc7f 0xb58cdb7c 0x089d0a88

0xb58cd6b8: 0xb58cdbd8 0x0000001c 0x00000011 0x00000001

0xb58cd6c8: 0x0000001d 0x00000181 0xb58eeb70 0xb58ddcec

0xb58cd6d8: 0x00001ce3 0xb58cdbec 0xb58cd5c0 0x00000075

0xb58cd6e8: 0x00000000 0x00000000 0x00000000 0x00000181

0xb58cd6f8: 0x0000001d 0x00000001 0x00000000 0x00000001

0xb58cd708: 0x00000000 0x00000000 0x007a9ae7 0x00000000

0xb58cd718: 0xb58ee0d4 0x09ee8140 0x00000000 0xffffffa8

0xb58cd728: 0xb58cd9f8 0xffffffa8 0x00000000 0x00000000

0xb58cd738: 0x00000001 0x00000000 0x007e53a0 0x00000000

0xb58cd748: 0x00000000 0x00000000 0x00000000 0x00000000

0xb58cd758: 0xb58cd920 0x007a96ef 0x0000000a 0xffffffff

0xb58cd768: 0x00000100 0x00000001 0x00000001 0xb58cd5c0

0xb58cd778: 0xffffffff 0x00000000 0x00000000 0x00000000

0xb58cd788: 0x00000000 0x00000000 0x00000000 0x00000000

0xb58cd798: 0x00000000 0x00000000 0x00000000 0x00000000

0xb58cd7a8: 0x00000000 0x00000000 0x00000000 0x00000000

0xb58cd7b8: 0x00000000 0x00000000 0x00000000 0x00000000

6.反推得到的栈帧如下

0xb58cd508 0x00de8d06

0xb58cd548 0x00de9b11

0xb58cd568 0x00de9cf6

0xb58cd5c8 0x00885a2d

0xb58cd5e8 0x0851f996

0xb58cd658 0x0854bbc5

0xb58cd688 0x0853806b

0xb58cd6a8 0x0852a9fe

0xb58ddd88 0x0851cc7f

7. 用info symbol xxx反推得到各个函数名

info symbol 0x00de8d06 queryIPVddd

info symbol 0x00de9b11 queryIPVccc

info symbol 0x00de9cf6 queryIPVbbb

info symbol 0x00885a2d queryIPVaaa

info symbol 0x0851f996 queryIPVzzz

info symbol 0x0854bbc5 queryIPVyyy

info symbol 0x0853806b queryIPVxxx

info symbol 0x0852a9fe queryIPVtable

info symbol 0x0851cc7f addOrUpdateIPVDevice

只要我们够耐心,我们可以查看整个4GB(32-bit机器)的内存镜像,然后一只反推到main函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: