嵌入式core dump调试方法

原创 2015年11月20日 12:21:43

 一、为什么使用coredump

有的时候写的程序总会遇到各种异常或者bug导致退出中止,但是程序却没有打印出可供参考的log信息,这时候就可以利用code文件进行分析。一般情况下,code文件会记录程序运行的内存,寄存器,堆栈指针等信息,想要使用code文件分析,就需要在linux系统中设置一下。

二、嵌入式下coredump生成设置

1.一般linux系统下默认是不会生成core dump文件的(毕竟生成的文件还是蛮大的),通过ulimit –a (如下图所示)可以查看能生成的code文件的大小,一般是0。可以通过“ulimit –c 参数(blocks)”或者“ulimit –c unlimited”设置,建议用后者。

imageimage

2.设置core dump文件的输出位置,一般默认是当前目录,可以通过“echo “1” > /proc/sys/kernel/core_user_pid ”使core文件加上pid号,也可以用“echo ”core保存目录/core-%e-%p-%t“ > /proc/sys/kernel/core_pattern ” 设置。

以下是参数表:ps:用到的也就那么几个

%p – insert pid into filename 添加pid

%u – insert current uid into filename 添加当前uid

%g – insert current gid into filename 添加当前gid

%s – insert signal that caused the coredump into the filename 添加导致产生core的信号

%t – insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间

%h – insert hostname where the coredump happened into filename 添加主机名

%e – insert coreddumping executable name into filename 添加命令名

3.运行程序,等停止退出后将生成的core文件,通过挂载u盘或者网络的方式拷贝到pc机Linux系统下,并和生成的可执行程序放在一个目录下。

ps:重启有可能会将上面的设置清除,最好运行前查看一番。

三、pc机Linux下分析core文件

1.先确定自己用的嵌入式处理器架构是ARM或者MIPS,选择相应的调试工具,下面以MIPS为例。mips-linux-gdb [exec file] [core file]

2.进入gdb以后需要运行info sharedlibrary来查看是否已经将需要的库导入,否则有可能查找位置时显示的是“??”。

image image

3.导入所需要的库,通过set solib-absolute-prefix 或者set solib-search-path 设置符号文件的位置。solib-absolute-prefix设置的是被搜索文件路径的前缀,solib-search-path设置的是被搜索文件的路径,solib-search-path可以有多个路径,中间按用:隔开, solib-absolute-prefix的值只能有一个。但一般常用solib-search-path 。

首先通过find或者其他方法找到所需要的库,“(gdb)solib-search-path 库路径:库路径”

 image image

4.最后通过bt命令查找到位置,基本就能确定程序死在哪个文件哪个函数了。可以通过“(gdb)l *地址”(如:(gdb)l *0x76b693dc)查看那个位置的函数,不过还是建议用source insight查看方便。

5.最后补充一个查看库文件结构的命令

Linux下动态库查看方法:nm -D lib.so

Linux下静态库查看方法:ar -t lib.a

利用core 文件查找嵌入式程序中的溢出点

利用core 文件查找嵌入式程序中的溢出点
  • lile777
  • lile777
  • 2015-08-31 16:52:25
  • 765

3分钟搞定杀手级的coredump问题

刚入职的时候, 遇到了一个必然出现的coredump问题, 当时查代码, 完全正确, 某哥在帮我调试, 后来我也没有改什么代码, 也不知道怎么滴, 那个coredump问题居然就消失了。 当时没有搞明...
  • stpeace
  • stpeace
  • 2016-06-17 23:35:20
  • 3149

gdb调试(查看函数栈、调试coredump文件)

查看函数栈用在gdb中用bt,观察变量值用watch(变量值发生变化时会暂停程序的执行) 一、调试coredump文件 什么是Core Dump? Core的意思是内存, Dump的意思是扔出来...
  • xuelongyinyue
  • xuelongyinyue
  • 2016-03-29 16:48:53
  • 913

arm linux coredump功能

1. 要打开该功能,需要先配置内核 +CONFIG_EXPERIMENTAL=y +CONFIG_ELF_CORE=y 2. 打开ulimit功能 ulimit -c unlimi...
  • ee230
  • ee230
  • 2016-09-26 10:20:28
  • 649

段错误调试神器 - Core Dump详解

搬运自:http://www.cnblogs.com/lidabo/p/5014710.html   一、前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). ...
  • u013267687
  • u013267687
  • 2016-08-10 15:15:08
  • 1546

coredump简介与coredump原因总结

coredump简介与coredump原因总结 什么是coredump? 通常情况下coredmp包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等。可以理解为把程序工作的当前状态存...
  • newnewman80
  • newnewman80
  • 2012-11-12 13:11:35
  • 31446

coredump来调试崩溃进程

在平常开发中,经常碰到进程异常崩溃退出的情况,这时候最便捷的方法就是生成core文件,然后通过gdb在查看程序崩溃时的调用栈,一般很快就能定位出问题。 linux系统中程序异常崩溃时默认是不会自动生成...
  • tg78007
  • tg78007
  • 2015-04-21 11:40:01
  • 992

linux下产生core文件以及不产生core文件的条件

原文:http://team.eyou.com/?p=27 Linux下,产生core文件,和不产生core文件的条件: 当我们的程序崩溃时,内核有可能把该程序当前内存映射到c...
  • zz709196484
  • zz709196484
  • 2017-02-04 23:13:52
  • 5806

ARM 架构 dump_stack 实现分析(2.0 调用时序)

看下具体调用时序: void dump_stack(void) { dump_backtrace(NULL, NULL); }   dump_stack -->dump_backtrace...
  • liyongming1982
  • liyongming1982
  • 2013-11-15 22:31:13
  • 2997

linux中的hexdump命令

之前介绍过linux下的xxd命令, 现在说hexdump, 从含义来讲, 就是把文件中的hex   dump出来, 类似的有objdump, tcpdump,  我们来看看hexdump, 如下: ...
  • stpeace
  • stpeace
  • 2016-10-20 23:51:43
  • 2608
收藏助手
不良信息举报
您举报文章:嵌入式core dump调试方法
举报原因:
原因补充:

(最多只允许输入30个字)