Chinaunix首页 | 论坛 | 博客
  • 博客访问: 33973
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2017-01-22 19:18
文章分类
文章存档

2017年(21)

我的朋友

分类: 嵌入式

2017-02-06 14:54:05

通过gdb调试和core文件定位Segment fault问题的主要工作有4步:前3步是准备工作,第4步是具体的调试,描述如下:

1. arm-linux-gdb调试工具安装

(1)去 路径下载最新的gdb工具,可将压缩包放到/usr/local/arm/路径下

(2)以gdb-7.9.tar.gz为例,编译安装arm-linux-gdb,需执行如下指令。

#tar -zxvf gdb-7.9.tar.gz
#cd gdb-7.9
#./configure -target=arm-linux -prefix=/usr/local/arm/arm-gdb-7.9
#make
#make install

configure的-target选项为arm-linux,生成makefile文件,目标是arm-linux-gdb;make完成编译,make install 进行安装。然后在/usr/local/arm/arm-gdb-7.9/bin目录,会看到编译生成的arm-linux-gdb工具。

2. 生成带有调试信息的可执行文件

gdb调试时,要求可执行程序里需包含必要调试信息(如包括扩展的符号表、行号、局部 或外部变量信息),这就需要确保两点:

(1)CC加-g或-ggdb选项编译

(2)屏蔽掉strip命令(如果makefile文件是从其他项目中移植的,可能会包含strip命令,用以删除调试信息)。

3. 生成core文件

(1)程序异常结束时,内核会自动将相关的寄存器、内存等信息转存到一个core文件中。为确保core文件的正常生成,需先放开内核对资源的限制。

#ulimit -c unlimited

然后kill掉原有进程,手动执行包含调试信息的可执行程序。如下(envcore为可执行程序名,可通过nfs的方式挂载到设备目录下):

./envcore &

当进程异常结束时,会在同一目录下生成core文件。core文件可能有上百兆,设备里可能无足够空间存储这么大的文件。所以可通过nfs的方式将虚拟机里的文件系统挂载到设备中,然后执行./envcore,这样生成的core文件,就会直接保存在虚拟机中。在设备的串口输入如下命令(其中10.1.11.111为虚拟机地址,/tmp/为设备的挂载点。
mount -t nfs -o nolock 10.1.11.111:/xxx/nfs /tmp/ 
4. 通过gdb调试和core文件定位问题

(1)如果arm-linux-gdb工具安装在虚拟机的/usr/local/arm/arm-gdb-7.9/bin目录下,需先将包含调试信息的可执行程序(如encore),以及core文件拷贝到同一目录下。然后执行如下命令:
#./arm-linux-gdb ./envcore ./core
#where

即可看到进程异常结束点对应的文件名、函数名、以及具体的代码行。

阅读(1994) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~