您当前的位置:首页 > 计算机 > 编程开发 > 编译原理

gdb+gdbserver远程调试技术(二)解决segmentation-fault

时间:08-17来源:作者:点击数:

segmentation-fault段错误一直是一个很难解决的问题,尤其是当代码量很大的时候寻找起来更是如大海捞针一般,本文将介绍通过gdb+gdbserver来找到出错的位置。

segmentation-fault段错误有时候每次都能重现出来,这种问题相对来说比较好调试可以直接在线调试。有的问题比较难重现,甚至可能运行好几天才有可能重现,这种问题一般是通过分析segmentation-fault段错误产生的core文件。

下面给出本文用的示例代码:

test.c

#include <stdio.h>  
#include <string.h>

int main()  
{  
	char* p;

	memcpy(p, "hello", 5);

    return 0;  
} 

用gdb调试代码时必须加上-g选项,如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。先对示例代码交叉编译到目标机上:

arm-linux-gnueabi-gcc -g test.c -o test

将生成的可执行程序test拷贝到目标机上便可以开始本次试验了。

一、直接在线调试

1.在目标机上启动gdbserver
$ gdbserver 192.168.0.139:6666 /test 
这里写图片描述
2.在宿主机上启动gdb
$ arm-linux-gdb test
这里写图片描述
3.连接目标机
(gdb) target remote 192.168.0.138:6666

若连接成功会有下面提示:

这里写图片描述

在目标机上也有连接成功提示:

这里写图片描述
4.调试

执行指令 c(continue)让程序开始执行并出错,若错误简单可直接显示出错误的具体位置:

这里写图片描述

可以通过指令bt来查看当前的堆栈信息:

这里写图片描述

若程序比较复杂,出错时没有显示出具体的出错信息,可通过where指令来查看出错的位置:

这里写图片描述

二、抓取core文件

1.系统设置

Linux系统默认core文件的大小限制为0,即产生segmentation-fault段错误时不会生成core文件,可以通过ulimit -c指令来查看系统限制。可以通过ulimit -c filesize命令来修改系统对core文件大小的限制,但如果core文件超过限制大小(filesize的单位为kbyte)将会被裁剪,最终生成一个不完整的core文件。在调试此core文件的时候,gdb会提示错误。所以一般情况下不会限制core文件的大小,指令如下:

$ ulimit -c unlimited
2.产生core文件

当运行程序出现segmentation-fault段错误时,如果产生core文件,会在终端有如下打印:

这里写图片描述

在当前目录下也会生成core文件:

这里写图片描述
3.调试core文件

core文件产生之后将其拷贝到宿主机,不需要连接目标机便可调试。运行下列指令启动gdb:

$ arm-linux-gdb test core
这里写图片描述

由于本文采用的示例比较简单,gdb已经列出了出错的具体位置,敲击回车,gdb列出了具体出错的代码:

这里写图片描述

可以通过指令bt来查看堆栈信息:

这里写图片描述

可以通过where指令来定位出错的位置:

这里写图片描述
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门