• 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
    ",tmp_str);
    
        memset(&tmp_str, 0, 25*sizeof(char));
        MID_TVFE_GetVersionInfo(MID_TVFE_FlashVer, tmp_str, sizeof(tmp_str));
        printf("[Flash Type]:%s
    ",tmp_str);
    
        memset(&tmp_str, 0, 25*sizeof(char));
        MID_TVFE_GetVersionInfo(MID_TVFE_OTAVer, tmp_str, sizeof(tmp_str));
        printf("[OTA version]:%s
    ",tmp_str);
        printf("===================================
    ");
        printf("End Version
    
    ");
    }

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

      

  • 相关阅读:
    Java基础知识三点
    《计算机网络》读书笔记
    Shell编程初步
    《现代操作系统》读书笔记
    《数据库系统概论》读书笔记
    《数据结构》读书笔记
    Linux使用笔记
    【Thinking in Java】读书笔记
    算法题摘录六
    算法题摘录五
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/7819142.html
Copyright © 2020-2023  润新知