linux调用栈段错误,捕获段错误堆栈的方法 - jason-jack的个人空间 - OSCHINA - 中文开源技术交流社区...

使用gdb core调试

1、 如果想让系统在信号中断造成的错误时产生core文件, 我们需要在shell中按如下设置:

#设置core大小为无限

ulimit -c unlimited

#设置文件大小为无限

ulimit unlimited

2、编译时加上 -g -rdynamic ,使可执行程序带调试信息

gcc -g -rdynamic d.c

3、 gdb [exec file] [core file]

如:gdb ./test test.core

在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件->行.

利用backtrace和objdump进行分析

#include

#include

#include

#include

/* A dummy function to make the backtrace more interesting. */

void

dummy_function (void)

{

unsigned char *ptr = 0x00;

*ptr = 0x00;

}

void dump(int signo)

{

void *array[10];

size_t size;

char **strings;

size_t i;

size = backtrace (array, 10);

strings = backtrace_symbols (array, size);

printf ("Obtained %zd stack frames.\n", size);

for (i = 0; i < size; i++)

printf ("%s\n", strings[i]);

free (strings);

exit(0);

}

int

main (void)

{

signal(SIGSEGV, &dump);

dummy_function ();

return 0;

}

编译运行结果如下:

$ gcc -g -rdynamic g.c

$ ./a.out

Obtained 5 stack frames.

./a.out(dump+0x19) [0x80486c2]

[0xffffe420]

./a.out(main+0x35) [0x804876f]

/lib/libc.so.6(__libc_start_main+0xe6) [0xb7e02866]

./a.out [0x8048601]

用objdump反汇编程序,找到地址0x804876f对应的代码位置,或相近的位置。

$ objdump -d a.out

8048765: e8 02 fe ff ff call 804856c

804876a: e8 25 ff ff ff call 8048694

804876f: b8 00 00 00 00 mov $0x0,%eax

8048774: c9 leave

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值