broadcom6828开发环境利用内存转储定位Crash

本文描述如何利用内存转储来定位嵌入式板子上应用程序Crash,当前开发环境为BCM 6828

一、 开启内核支持,当前BCM 6828默认没有开启。

1、如果之前编译过,先删除kernel/linux/vmlinux,否则编译流程不走第二步。

2、编辑hostTools/scripts/defconfig-bcm.template文件,找到CONFIG_ELF_CORE这项,改为

CONFIG_ELF_CORE=y,当前BCM的内核选项配置文件是使用hostTools/scripts/gendefconfig生成,最终会使用defconfig-bcm.template覆盖内核目录的.config

3、编译内核,并下载到当前调试的板子上。(注意,这里有时候编译出的镜像会加载DSP驱动模块失败,重新全编译一下,再下载到板子上就可以了,原因不知)

重新编译内核时会提示生成的内存转储文件是否包含ELF头信息,当前FLASH空间够用,选上它。

二、修改应用程序代码,生成内存转储文件并去除编译优化选项。

1、修改应用程序的Makefile编译文件,主要保证使用-g调试选项、并去除-o优化选项,来编译当前应用程序项目,如果不修改的话,后面进行GDB分析时,调试信息会显示不太全。

2、修改应用程序的代码,去除应用程序中含有Linux信号处理的所有代码,否则无法生成内存转储,并在应用程序的启始代码处添加如下代码,下面代码主要开启内存转储(当前如果不添加如下代码,在板子上使用ulimit -c命令设置也可以,但主要考虑有些嵌入式项目中busybox没有开启该命令,或者有些嵌入式项目的应用程序是脚本拉起,脚本拉起的应用程序要正常使用ulimit命令必须在脚本里添加,所以这些都不如直接在代码中开启比较稳妥),添加如下代码后,会将内存转储生成到/var目录下(生成内存转储的目录一定要可写),生成的名件名为“vtp_core_当前信号_当前时间.当前进程ID”。

#include <stdlib.h>
#include <sys/resource.h>
#include <errno.h>
 
int vtpEnableCoreDump(int iFlag)
{
    struct rlimit stRlim = {0};

    stRlim.rlim_cur = stRlim.rlim_max = iFlag ? RLIM_INFINITY : 0;

    if (0 != setrlimit(RLIMIT_CORE, &stRlim))
    {
        printf("Error: setrlimit failed, %s\n", strerror(errno));
        return 0; 
    }
    else
    {
        system("echo /var/vtp_core_%s_%t > /proc/sys/kernel/core_pattern");
        system("echo 1 > /proc/sys/kernel/core_uses_pid");
        system("echo 1 > /proc/sys/fs/suid_dumpable");
        printf("Set coredump file size to %lu, path = /var\n", stRlim.rlim_cur);
        return 1;
    }

    return 0;
}

vtpEnableCoreDump(1);

如下图为作者本人项目上测试的代码,在当前项目的启始处屏蔽了系统信号处理相关代码,并添加了开启内存转储的代码。
 

3、为了方便测试,我在本人项目的代码流程中故意加入了产生Crash的错误代码。

三、将编译好的调试版本烧录到板子上,这里一定要记得之前编译选项加上-g,并去掉-o的优化选项。

四、调试

1、前面流程在应用程序代码中故意加入产生Crash的代码,进行操作使得应用程序触发我们故意添加的Crash,此时会在/var目录下生成如下内存转储文件。

2、将板子产生的内存转储文件下载到本地的编译主机上。

3、在本地编译主机使用交叉编译工具链中的GDB程序进行调试,GDB程序的第一个参数-c指示内存转储的文件位置,第二个参数是之前编译好的应用程序可执行文件。

GDB里我们很明显看到,当前收到了11段错误信号,程序死在spucps.c文件,1280行,cps_tele_digit函数,*p = “123”的代码位置。

还可以使用bt查看死得时候的函数调用,其它查看方法可以参考GDB手册。

备注:

并非所有信号都可以产生coredump文件,详细哪些信号可以产生coredump文件请参考《APUE》圣经里的介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值