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