嵌入式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;

//定位到了错误处
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值