嵌入式Linux开发中如何定位崩溃处?

程序崩溃

程序开发中难免会因为各种各样的问题导致程序崩溃, C/C++语言开发过程中最常见的就是由于内存的问题导致的崩溃。

例如:

#include "stdio.h"
#include "stdlib.h"

int main(void)
{

    int *p = NULL;
    *p = 1;
    return 0;

}

导致:
Segmentation fault (core dumped)

GDB搭配Coredump

GDB

GDB是用来进行程序调试的,例如:单步调试,打断点等,配合openocd就可以进行JTAG调试了(此文非重点)。

生成执行文件时,注意添加-g(gcc -g),否则不能GDB调试。

交叉编译安装

  1. 源码下载: http://ftp.gnu.org/gnu/gdb/

  2. 配置编译选项:

    ./configure --target=arm-linux  --program-prefix=fsl  --prefix=xxx	CC=xxx
    
    --target  目标平台
    --program-prefix  编译后的前缀,可不要
    --prefix  install安装处,也就是复制到哪个路径下
    CC gcc路径
    
  3. make make install

  4. 遇到问题(缺少termcap库)

    4.1 编译安装termcap

    ​ 源码下载:http://ftp.gnu.org/gnu/termcap/

    ​ 修改Makefile: CC = AR =

    4.2 复制termcap.a和termcap.h到编译链的库下

    ​ 查找编译链搜索路径: ./XXX-gcc -print-file-name=libc.a

    4.3 再次在GDB下make即可

  5. 复制生成的gdb到目标板上

Coredump

在程序崩溃时,系统会将崩溃处的堆栈等信息保存到一个文件,GDB可以借助此文件找到程序崩溃点。

//配置

echo 1 > /proc/sys/kernel/core_uses_pid
ulimit -c unlimited
echo "your_dir/core.%e.%p.%t" > /proc/sys/kernel/core_pattern

演示

使用代码为<程序崩溃>的展示代码

./a.out
Segmentation fault (core dumped)
//生成文件:core.a.out.1444.218

//调试
./fslgdb a.out core.a.out.1444.218

GNU gdb (GDB) 7.3
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=arm-fsl-linux-gnueabi --target=arm-linux".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /mnt/linux/share/linux_ipc_domain/a.out...done.
[New LWP 1444]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x000083ac in main () at coredump.c:12
12          *p = 1;

//定位到了错误处
上一篇:linux gdb调试C/C++多线程死锁的定位


下一篇:单片机程序中,Modbus功能码的回调函数如何编写--FreeModbus从站设计(10)