分类: 嵌入式
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
即可看到进程异常结束点对应的文件名、函数名、以及具体的代码行。