MTK调试的奇淫技巧(2012-4-12 18:02)
不言而喻,无论是开发还是技术支持,与bug打交道在所难免。如果掌握了一些好的方法的话,可以起到事半功倍的效果。
大致说来,mtk平台,无非是以下几种方式加trace信息:
一、向串口输出。优点,方便,快捷,缺点是打印太快,有些重要信息不易获取,不能过滤,要搜索半天,rder们乐此不彼。比较适合调试驱动程序。
二、使用catcher工具。缺点,使用起来优点复杂。优点是能获取足够多的trace信息,可以过滤掉不关注的模块,供快速分析定位问题。比较适合开发一般MMI应用。
三、写文件。兼备上述第一点盒第二点的优点,缺点是需要再使用ultra edit等其他第三方工具进行分析。此种方法适合开发利用socket进行联网的程序。
mtk平台是基于arm平台,大家一般都会遇到data abort的问题,一般是内存访问异常,如数组越界,内存越界(指针),分析定位这类问题,一般都是与内存操作相关的函数引起的,如strcpy,memcpy,kal_wstrcpy等等。一般是根据程序的运行流程,加一些函数打点轨迹的trace,如“enter [EntryIdleScreen],6651”(6651是行号)。一般能分析到程序是挂在哪个函数里面。
倘若不能定位是挂在哪个函数,有点小技巧就是,在可疑的函数里加一些kal_sleep_task,让MMI sleep一下,以便将尽可能多的信息打印出来。
倘若此法失效。那只有根据程序挂了之后的堆栈,进行分析了。这种方法已经有人介绍,在此不赘述了。值得注意的是,lr寄存器的内容,值得关注,这是函数的返回地址,根据这个地址,一般能查到调用函数的地址。
对于prefetch abort和undefined instruction,一般是内存被踩了导致的。需要花相当大的时间与精力分析了。只有多加trace,此外,貌似没有更好的方法。
另外,arm一般没有除法指令,以及对于float的支持,尤其是不给力。所以在mtk里,尽量不要使用浮点数,一是运行起来颇慢,更要命的是,很容易出现prefetch abort,undefined instruction,data abort。尤其是将浮点数,格式输出到缓冲区里的时候,切忌使用kal_wsprintf,必须使用kal_printf,否则后果不堪设想。
下面是mtk工程里的一个实现函数,颇为有用:
dev_extern dev_void devlib_ftoa(dev_int8* pBuffer, dev_real64 fvalue, dev_int nDecimal)
{
dev_int8 format[16];
sprintf(format, "%%.%df", nDecimal);
sprintf(pBuffer,format,fvalue);
}
供大家参考。
另外,建议开发者多参考mtk工程里,别人写的成熟代码,“拿来主义”,不能一知半解(mtk的API文档一般不全,代码函数的注释也不能望文生义)。
希望大家开发快乐,快乐开发!
这是我的一点小小心得,与诸位分享。有不妥之处,请大家不吝指出,以期共同进步!
本文来自:我爱研发网(52RD.com) - R&D大本营
详细出处:http://www.52rd.com/Blog/Detail_RD.Blog_setagllib_30388.html