一、Catcher log
Catcher是MTK提供的功能机上一个功能比较强大的一个log工具。
Catcher log一般情况下使我们使用起来最多也最方便的一种,不用跳线,连接上USB就行。
Catcher log的使用上有可以分为三种:系统log,自定义log,memory dump。
系统log,系统log是指MTK在我们的代码或lib中提前已经预置好的一些log,如果出现问题时候,只要在catcher中勾选相应mode、trace group中就可以了,一般这种log主要是mmi那边在使用,出现死机或者其他一些问题时候就需要这种log来分析关键的代码流程。
用户log,用户log就是我们自己添加到代码中去打印抓取你所需要的信息时用的。
比如我们做LCD兼容的时候,拿到的lcd的id引脚的电压值是多少我们不知道,就可以下下面这样添加一下,然后再catcher中勾选MOD_USB把它打印出来。
首先确定需要抓LOG的地方,然后在对应函数中添加代码
kal_prompt_trace(MOD_USB,"mmi_fm_select_receiver_hdlr");
kal_prompt_trace相当于C语言中printf函数
添加好后,对其进行编译,并将软件下载到手机
手机开机输入*#36951#进入模式,设置USB1,921600,保存设置,手机将会自动关机
手机开机,通过Catcher软件抓取USB log
选择相关项目build文件夹中软件下载目录下的BPL开头文件
然后点Connect,再点Filter,选择USB,确定,最后开始抓LOG
Memory Dump 出现死机问的时候会用到。配合MTK释放的分析工具可以知道最后在死机发生时系统中代码执行的堆栈情况.
1.首先和前面抓系统log一样,线连接好catcher
2.操作手机到死机现象的发生,然后导出memorydump
3. 使用FP_OfflineDebugSuite.exe这个工具对memorydump进行分析。
其中memorydump就是从catcher中到处的memorydump,elf file是在build路径下有一个很大的elf文件。执行分析后就会在memoryDump文件路径下生成许多文件。
我们主要关注的是”分析报告.txt”这个文件中的内容。这个文件中会给出死机的原因以及最后死机时候的函数堆栈情况,这个对我们分析函数流程会很有用。有时候如果我们想知道一段代码的调用流程是怎样的也可已在代码中使用ASSERT(0),强制引入死机用于分析代码流程。
二、串口log
功能机上串口log用两种使用方法:跳线,手机自带的USB转com口。
最终的效果是差不多的,都是可以在串口助手这边抓到信息的。
当然跳线方式的log的启动时间会更早一些,能够抓到一些开机上电时候的log,这种log用USB的方式抓取不到。
三、写文件log
主要是由于在一些无法使用USB,跳线等方式获取关机log信息时,选择把log保存到机器和T卡中
#if 1
void smn_export_battery_status_change(kal_uint8* function, kal_int32 value)
{
FS_HANDLE h;
S8 buf[256] = {0};
WCHAR path[255] = {0};
UINT written;
DCL_HANDLE rtc_handler = 0;
RTC_CTRL_GET_TIME_T rtc_time;
memset(buf, 0,sizeof(buf));
memset(path, 0,sizeof(path));
rtc_handler = DclRTC_Open(DCL_RTC,FLAGS_NONE);
DclRTC_Control(rtc_handler, RTC_CMD_GET_TIME, (DCL_CTRL_DATA_T *) &rtc_time);
DclRTC_Close(rtc_handler);
kal_wsprintf(path,"%c:\\%w", SRV_FMGR_PHONE_DRV,(WCHAR *)L"battery_status.txt");
if((h = FS_Open ((const WCHAR *)path, FS_CREATE | FS_READ_WRITE)) > 0)
{
FS_Seek(h, 0, FS_FILE_END);
sprintf((char *)buf,"%d/%d/%d %2d:%2d:%2d, function: %s%d",
rtc_time.u1Year, rtc_time.u1Mon, rtc_time.u1Day, rtc_time.u1Hour, rtc_time.u1Min, rtc_time.u1Sec, function, value);
strcat((char *)buf ,",");
strcat((char *)buf ,"\r\n");
FS_Write(h, (void *)buf , strlen(buf), &written);
FS_Commit(h);
FS_Close(h);
}
}
#endif