MTK调试入门之一-TRACE使用的技巧

52RD上曾有朋友让我写一些调试技巧方面的文章.调试对于软件是十分重要的,但却不是一篇二篇文章能讲清楚的.有很多调试技巧都是零零碎碎的东西,用的时候能很容易使用,但要写出来时,却还是比较麻烦的.

MTK的调试一般来说可以分为仿真调试与手机调试.这两种调试对于研发新功能,修改BUG,研究算法都是十分重要的.当然,这两种调试也有差异,有时会出现在模拟器运行正常,在手机却运行失败,或者相反,这就突出了软件模拟环境与硬件手机环境的差别.原因可能是各种各样的,比如可能是有些硬件软件没有办法模拟,有些新功能对硬件依赖强,不能模拟,新软件的有些函数只能在手机上运行,没有写相应的模拟器代码.等等原因都会导致两者差异.这里不一一赘述,大家知道模拟器和手机有差异就行了.

模拟器调试具有直观,快速,追踪方便能优点,受到很多MMI开发者的喜欢.而有关模拟器的调试,其他也就是VC调试功能的使用.由于国内软件教育重编程,算法,轻调试,所以很少有系统的调试方书的书.在开发过程中,我也见过许多人压根就不使用模拟器,他们认为模拟器也就是在没有手机的时候使用.详细讲解模拟器的调试就放到以后,因为模拟器断点,内存,堆栈,变量各个方面的调试,详细写来都可以成一篇文章.这里先讲一个手机调试的TRACE使用.以前曾写过一篇DUMP调试的文章.通过出错的DUMP信息查找错误.有兴趣的朋友可以参考.Detail_RD.Blog_blogercn_19169.html

1.在MTK平台,我们最常使用的TRACE函数是kal_prompt_trace函数,这个函数是系统提供给我们的用于在catcher里调试错误的.在这个函数不能使用的场合,有时我们会使用函数system_print或者dbg_printf,这两个函数可以不使用catcher的情况,使用WIN自带的工具超级终端来调试程序.有时驱动的朋友会自己用函数PutUARTBytes写自已TRACE函数,这些函数可以使用超级终端调试,如下,就是别人写的一个TRACE函数.打印某一块数据的内容,常常TRACE内存数据,指定地址,指定大小

void perun_dump(void *buf, prn_int16 size){#ifdef PRN_TRACE_OPEN#ifdef MMI_ON_HARDWARE_P    char   str[2048];    char   *ptr = (char*)str;    char   *ptr1 = buf;    int    i = 0;      memset(str, 0, sizeof(str));    strcpy(ptr, "[Perun_dump]: ");     ptr +=strlen("[Perun_dump]: ");       while (i< size)     {        sprintf(ptr, " %02x", *ptr1);        ptr += 3;        ++ptr1;        ++i;     }    sprintf(ptr, "\r\n");      PutUARTBytes(0, (kal_uint8 *)str, (kal_uint16)strlen(str));#endif#endif}
也可以写一个像MTK自带的一样的函数来TRACE,如下,该函数也是可以运行在终端中:
Void perun_trace(char *fmt, ...){#ifdef PRN_TRACE_OPEN#ifdef MMI_ON_HARDWARE_P     va_listlist;    char   buf[2048];    char   *ptr = (char*)buf;      memset(buf, 0, sizeof(buf));    strcpy(ptr, "[Perun_trace]: ");     ptr +=strlen("[Perun_trace]: ");      va_start(list, fmt);    vsprintf(ptr, fmt, list);    va_end(list);      strcat(buf, "\r\n");       buf[2047] = 0;    PutUARTBytes(0, (kal_uint8 *)buf, strlen(buf));#endif#endif
}

2.TRACE语句的编写是十分重要的.如何写出的TRACE既能在仿真下使用,也能在手机中使用,我一般会使用如下的格式:

#ifdef WIN32#define MYTRACE printf#else#define MYTRACE(...) kal_prompt_trace(MOD_WAP, __VA_ARGS__)#endif

经过如下的封装,MYTRACE就可以既能在手机上运行,也能在电脑中运行,并且我已经消除了MTK自带的函数与printf在调用上的不同.顺便说一下,模拟器调用函数MYTRACE时,会在控制制输出该函数的打印信息.手机调用MYTRACE时,会在filiter为MOD_WAP时输出信息.

3.有时为了便于观察,我会为我的TRACE语句添加一个前缀,比如我自己的TRACE前面添加十个>或者我自己的拼音名字,我会如下修改我的MYTRACE:

#ifdef WIN32#define MYTRACE printf#else#define STR(s) #s#define MYTRACE(...) kal_prompt_trace(MOD_WAP,STR(>>>>>>>>>>)##__VA_ARGS__)#endif

经过这样的改进,我的TRACE在输出信息时,信息头就是我的名字,我可以使用查找全部功能把我需要的TRACE全抓出来.如果你对#号的使用,有疑问,请自己查找相关资料

4.种种迹象和从理论上看来,TRACE和MMI_ASSERT是调试的好帮手,但在发布软件时,带上了这个会引来不必要的麻烦.MMI_ASSERT增加了系统重启的频率.TRACE增加了系统的ROM,RAM和CPU的开销.在工作中,我们曾经发现一款手机,由于ROM过于紧张,添加几条TRACE就会出现编译错误,去掉TRACE就编译通过了,导致出了BUG调试十分的麻烦.如何写一种使用时可以TRACE错误,不使用时又不占用系统资源的TRACE呢,我见许多人这样处理,因为NULL会被编译器优化点,后面括号变成一个表达式了.表达式对系统的开销自然小于函数了.

#ifdef DEBUG_KAL#define MYTRACE(...) kal_prompt_trace(MOD_WAP, __VA_ARGS__)#else#define MYTRACE NULL#endif

一般这样

#ifdef DEBUG_KAL#define MYTRACE(...) kal_prompt_trace(MOD_WAP, __VA_ARGS__)#else#define MYTRACE //#endif

我曾经认为这样写可以在不使用时,把宏函数变为注释符,但我的一个朋友认为这样写,并不能把我的函数变成注释符,他的道理是双斜线会被编译器外忽略掉,我认为是有道理的,后来我的朋友经过思考,写出如下的TRACE,通过一个反斜杠的连接符,哄编译器在展开宏时把两个斜杠连起来组成注释符,这个写法有些古怪,下面的单个斜杠必须顶格写,以保证经过连接合,两斜杠之间没有空格从而在被编译时与后面的代码组成注释行.但这样写的一个致命的缺陷是会让许多人看不明白.另一个缺陷时不美观

#ifdef DEBUG_KAL#define MYTRACE printf#else#define MYTRACE /\/#endif

5.有关C语言的古怪用法,据<C专家编程>的作者曾说,世界上有一个古怪的大赛叫”国际C语言混乱代码大赛”,每年举办一次.获奖的都功能齐全而代码惨不忍睹的典型.在MTK上,也曾经有一段费了我很大功夫的TRACE代码:

#define DBG_PRINTF(_x_) \do{ \printf("%s(%d)--:",__FILE__,__LINE__);\printf  _x_; \}while(0);

当时怎么想都不明白为什么会有这么古怪的使用printf _x_;后来才发现使用时要加双层括号才能正常使用。

6.在手机与网络,手机与电脑的交互过程中,有时我们需要TRACE数据包的内容,特别在显示不正确或者不精确的情况下,需要研究数据包的数据是使用UTF编码,还UCS2编码,还是ASC编码,这时我们就需要TRACE数据的字节内容,从而便于分析。我一般使用下面这个自己随手写的函数来实现.

 

static U8 TraceUni(U8 *str, U8 len)
{U8 *tempstr,*tempascstr;U8 i;tempstr = str;kal_prompt_trace(MOD_MMI,"XXXXXXXXXXXXXXXXXXXXXXXX   Tracemmi_msg_handle_new_msg_ind isstart   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");if (*(tempstr + 1) == 0x00){UnicodeNToAnsii((S8*)tempascstr,(S8*)tempstr,len);kal_prompt_trace(MOD_MMI, "jone trace, thestring = %s", tempascstr);}else{for (i = 0; (*tempstr != NULL) || (*(tempstr+1)!= NULL) && (len-- != 0);i++){kal_prompt_trace(MOD_MMI,"jone trace, the string[%d] = %x", i, *(tempstr++));}}kal_prompt_trace(MOD_MMI,"XXXXXXXXXXXXXXXXXXXXXXXX   Tracestring isend     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");return 0;
}

转载于:https://www.cnblogs.com/harisucici/archive/2011/11/30/2268859.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

互联网大脑进化简史,华为云EI智能体加入-2018年7月新版

要&#xff1a;华为云EI智能体是2018年以来产生的第八个类脑智能巨系统&#xff0c;在中国&#xff0c;目前除了小米、联想、今日头条&#xff0c;几乎所有的互联网巨头都提出了自己的”大脑“系统建设计划。1969年互联网诞生以来&#xff0c;网状模型一直是互联网最基础和重要…

Windows 必备神器 Cmder 使用教程

From&#xff1a;终端利器Cmder&#xff1a;https://www.e-learn.cn/topic/3885768 1. 安装 Cmder 打开 Cmder官网&#xff08; https://cmder.net &#xff09;&#xff0c;下拉页面找到 Download 项选择下载&#xff0c;下载的时候&#xff0c;两个版本&#xff0c;分别是 mi…

T-SQL查询进阶--流程控制语句

概述 和其他高级语言一样&#xff0c;T-SQL中也有用于控制流程的语句。T-SQL中的流程控制语句进一步扩展了T-SQL的力量……使得大部分业务逻辑可以在数据库层面进行。但很多人对T-SQL中的流程控制语句并没有系统的了解&#xff0c;本篇文章会系统的对T-SQL语句中的流程控制语句…

潘建伟团队首次实现18个光量子比特纠缠,刷新世界记录

来源&#xff1a;澎湃网摘要&#xff1a;中国科学技术大学潘建伟教授及其同事陆朝阳、刘乃乐、汪喜林等通过调控六个光子的偏振、路径和轨道角动量三个自由度&#xff0c;在国际上首次实现18个光量子比特的纠缠&#xff0c;刷新了所有物理体系中最大纠缠态制备的世界纪录。中国…

Frida Hook 常用函数、java 层 hook、so 层 hook、RPC、群控

From&#xff1a;Frida hook 常用函数分享&#xff1a;https://www.52pojie.cn/thread-1196917-1-1.html From&#xff1a;Frida Hook Android 常用方法&#xff1a;https://blog.csdn.net/zhy025907/article/details/89512096 Frida 使用&#xff1a;https://zhuanlan.zhihu.c…

struts 1.2配置文件

struts 1.2配置文件 2011-07-19 19:59 49人阅读 评论(0) 收藏 举报 Struts中是apache组织的MVC框架 下表列出了Struts中用到的lib包及其用途 包名称 用途 Common-beanutils.jar 简单易用的 Java 反射和内省 API 包装器 Commons-collections.jar 一组用于扩展和增强 Java Collec…

资本|五大科技巨头并购投资布局分析

来源&#xff1a;199IT互联网数据中心就买进而言&#xff0c;科技巨头可能是一个理想的收购方。Alphabet、亚马逊、苹果、Facebook和微软拥有巨大的市场价值&#xff08;3.9万亿美元&#xff09;。综合来看&#xff0c;五大科技巨头在整个并购市场占有相对较小的份额。下图显示…

安装 Chrome 插件:Stylish、xStyle​、Tampermonkey、SwitchyOmega

安装 Chrome 插件 3 种方法 方法 1&#xff1a;直接通过 chrome 插件商店安装&#xff0c;google 插件商店因为 "都懂的" 原因无法访问&#xff0c;如果会 "高科技" 上网可以忽略。直接通过插件商店安装方法 2&#xff1a;如果不会 "高科技" 上网…

第2节 多层PCB设计布局和布线原则

11.2.1 元器件布局的一般原则 设计人员在电路板布局过程中需要遵循的一般原则如下。 &#xff08;1&#xff09;元器件最好单面放置。如果需要双面放置元器件&#xff0c;在底层&#xff08;Bottom Layer&#xff09;放置插针式元器件&#xff0c;就有可能造成电路板不易安放…

数据库管理工具 Navicat 和 DBeaver

Navicat “Navicat” 是一套可创建多个连接的数据库管理工具&#xff0c;用以方便管理 MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB 和/或 MongoDB 等不同类型的数据库&#xff0c;并支持管理某些云数据库&#xff0c;例如阿里云、‎腾讯云。Navicat 和 Navicat …

百度Apollo发布中国首个自动驾驶安全报告,L3级别产品2020年量产上市

来源&#xff1a;雷锋网去年 10 月&#xff0c;全球自动驾驶研发先行者 Waymo 发布了长达 43 页的安全报告&#xff0c;里面详细说明了如何装备和训练自动驾驶车辆&#xff0c;从而避免驾驶过程中一些意外情况的发生。今年 1 月&#xff0c;美国车企巨头通用也发布了“2018 自动…

Chrome Devtools 高级调试指南

From ( Chrome Devtools 高级调试指南 )&#xff1a;https://juejin.cn/post/6844903961472974855 chrome devtools 设置黑色主题&#xff1a;https://blog.csdn.net/sinat_15347975/article/details/81151342 Chrome DevTools 实用技巧大全&#xff08;收藏&#xff09;&…

包揽全球50%以上份额,中美发力超级计算

来源&#xff1a;第一财经摘要&#xff1a;中国已经成为全球拥有最多超级计算机的国家。根据上周发布的一份最新榜单&#xff0c;全球排名前500强的超级计算机中&#xff0c;有206台是中国研制的&#xff1b;而美国仅拥有124台。多年来&#xff0c;美国长期主导着超级计算机市场…

Oracle函数translate()的用法

一、语法&#xff1a; TRANSLATE(string,from_str,to_str) 二、目的 返回将&#xff08;所有出现的&#xff09;from_str中的每个字符替换为to_str中的相应字符以后的string。TRANSLATE 是 REPLACE 所提供的功能的一个超集。如果 from_str 比 to_str 长…

Fiddler 抓包工具总结

From&#xff1a;https://www.cnblogs.com/yyhh/p/5140852.html 官方文档&#xff1a;https://www.telerik.com/support/fiddler Fiddler 调式使用 (一) --- 深入研究&#xff1a;https://www.cnblogs.com/tugenhua0707/p/4637771.html Fiddler 实战 --- 深入研究(二)&#…

Cassandra集群配置

版本&#xff1a;apache-cassandra-1.0.6机器1:10.16.233.27机器2:10.16.233.41机器3:10.16.233.45机器4:10.16.233.36机器5:10.16.233.39机器6:10.16.233.66机器1和机器2作为seed_providerjava jdk已经安装并且设置过JAVA_HOMEssh已经设置1.解压 apache-cassandra-1.0.6-bin.t…

云计算行业报告:2018, 风起云涌

来源&#xff1a;物联网智库摘要&#xff1a;依托弹性扩展、费用低、速度快的优势&#xff0c;云计算颠覆了传统IT架构&#xff0c;未来将成为主流的IT架构。多优势助力云计算颠覆传统IT服务架构经过十几年的发展&#xff0c;云计算已经形成了较为完善的生态系统&#xff0c;构…

charles 简单使用

From&#xff1a;https://www.cnblogs.com/wenjun145/p/12995535.html 1、下载安装 1. 下载地址&#xff1a;https://www.charlesproxy.com/latest-release/download.do 2. 下载之后安装。按照默认next 即可&#xff0c;然后选择路径。 3. charles 。PJ&#xff1a;https://ww…

文本框输入限制,数字,字母,下划线

1.文本框只能输入数字(小数点也不能输入) <input name"txt1" οnkeyup"this.valuethis.value.replace(/\D/g,)" onafterpaste"this.valuethis.value.replace(/\D/g, )"> 2.只能输入数字,能输小数点. <input name"txt1" οnk…

Facebook、谷歌、微软利用“黑暗模式”诱骗用户交出数据

来源&#xff1a;网络大数据摘要&#xff1a;挪威消费者委员会指出&#xff0c;Facebook、谷歌以及微软等科技巨头正在使用“黑暗模式”&#xff0c;或用户界面来诱骗用户交出自己的数据&#xff0c;以此推动用户被动选择不利于自身隐私保护的选项。据称&#xff0c;谷歌和Face…