登 录
註 冊
论坛
微波仿真网
注册
登录论坛可查看更多信息
微波仿真论坛
>
程序
>
MTK代码与Bug分析
发帖
回复
1479
阅读
0
回复
[
资料共享
]
MTK代码与Bug分析
离线
微明
UID :92502
注册:
2012-04-20
登录:
2012-07-20
发帖:
2
等级:
旁观者
0楼
发表于: 2012-04-20 19:50:11
C\;;9
不言而喻,无论是开发还是技术支持,与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和undefinedinstruction,一般是内存被踩了导致的。需要花相当大的时间与精力分析了。只有多加trace,此外,貌似没有更好的方法。
另外,arm一般没有除法指令,以及对于float的支持,尤其是不给力。所以在mtk里,尽量不要使用浮点数,一是运行起来颇慢,更要命的是,很容易出现prefetchabort,undefined instruction,dataabort。尤其是将浮点数,格式输出到缓冲区里的时候,切忌使用kal_wsprintf,必须使用kal_printf,否则后果不堪设想。
下面是mtk工程里的一个实现函数,颇为有用:
dev_externdev_void devlib_ftoa(dev_int8* pBuffer, dev_real64 fvalue, dev_int nDecimal)
W)6U6
{
<ol$-1l#9
dev_int8 format[16];
H=JP3ID>{
sprintf(format, "%%.%df", nDecimal);
^U0apI
sprintf(pBuffer,format,fvalue);
)OARO
}
[/ ..
E&RoaY0
MuCQxzvkhf
未注册仅能浏览
部分内容
,查看
全部内容及附件
请先
登录
或
注册
共
条评分
发帖
回复