RDA CoreDump 实例

Posted qiuri2008

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RDA CoreDump 实例相关的知识,希望对你有一定的参考价值。

  UMF进程的Coredump问题追踪:  通河code开机DUMP问题

现象:

  开机Dump,原因:_MAINAPP_SW_Init()调用了Factory_Ver_Debug()内存溢出。

分析流程:

  1、make menuconfig配置coredump导出功能

    

  2、程序Dump后会在U盘自动产生120MB大小的coredump file(core-b20171111_1153-s4287-MainAppxxx),这个文件就是Debug的GDB文件,用于分析堆栈线程。

    

  3、需要将coredump file与umf.gdb进程文件放在一起运行:

mipsel-unknown-linux-uclibc-gdb ./aps/application/radisson/atv_project/umf.gdb \\
./aps/application/radisson/atv_project/core-b20171111_0933-s4287-MainApp\\ Thread-1356998404

  GDB -> bt情况:

(gdb) bt
#0  _MAINAPP_InitSysApp (dTotalApp=<optimized out>) at main_app_initflow.c:1472
#1  MAINAPP_InitFlow (param=<optimized out>) at main_app_initflow.c:2328
#2  0x004f17e8 in MAINAPP_MainRoutine (pParam=<optimized out>) at main_app/main_app.c:420
#3  0x004f5f68 in thread_thread_handler (argp=0x8e6fd0) at gl_task.c:192
#4  0x005666a4 in ?? ()

  bt可以标注出线程调用关系及挂机位置,需要注意的是,有时内存越界的挂机不会立即表现出来,但某一个线程栈导致的问题,一般是不会影响到其它线程。所以第一可以判断出问题线程,第二如果内存溢出不能导致线程立即挂起的话,应该在GDB标记挂起的堆栈层次中向前查找问题原因。

  4、详细如下:

project.h

#define CUSTOMER_SOFTWARE_VERSON  "TONGHE_C031FH_1366x768_201711111345"    
#define CONFIG_SUPER_BIN_FILENAME  "RR8501_VIP.bin"    
#define CONFIG_SUPER_BIN_FILENAME_ALL  "RR8501_ALL.bin"    
#define BUILD_TIME  "20171111_134524"    
#define CONFIG_MODEL_BOARD_TYPE_DC
#define CONFIG_BIN_FILENAME  "RR8501_C031FH.bin"    
#define CONFIG_DEFAULT_PWM_REG_MIN  0    
#define CONFIG_DEFAULT_PWM_REG_MAX  522    

  注意客户版本号定义的字串,在显示客户信息的API ,调用Factory_Ver_Debug()都有引起coreDump。

void Factory_Ver_Debug(void)
{
    char tmp_str[25]={0};//内存越界

    memset(&tmp_str, 0, 25*sizeof(char));
    MID_TVFE_GetVersionInfo(MID_TVFE_CusSWVer, tmp_str, sizeof(tmp_str));//越界位置
    printf("[Customer SW Ver.]:%s\\n",tmp_str);

    memset(&tmp_str, 0, 25*sizeof(char));
    MID_TVFE_GetVersionInfo(MID_TVFE_FlashVer, tmp_str, sizeof(tmp_str));
    printf("[Flash Type]:%s\\n",tmp_str);

    memset(&tmp_str, 0, 25*sizeof(char));
    MID_TVFE_GetVersionInfo(MID_TVFE_OTAVer, tmp_str, sizeof(tmp_str));
    printf("[OTA version]:%s\\n",tmp_str);
    printf("===================================\\n");
    printf("End Version\\n\\n");
}

  使用CoreDump时,要关掉GCC优化,即设置GCC 优化级别为0

  

 

以上是关于RDA CoreDump 实例的主要内容,如果未能解决你的问题,请参考以下文章

创建片段而不从 java 代码实例化它

RDA安装

片段事务中的实例化错误

Oracle工具(Oracle Tools) – RDA(RemoteDiagnostic Agent)

web前端开发JQuery常用实例代码片段(50个)

Linux C/C++代码 使用gdb进行coredump调试