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