新闻  |   论坛  |   博客  |   在线研讨会
Debug小经验(摘抄)
xinjinlong | 2011-07-22 13:52:11    阅读:1752   发布文章
这个周在充电,就摘抄了一些东西:
如果驱动程序已经通过严格的测试,当发生PC OK但是机器上NG的bug时,通常是内存使用不当的问题。

当函数返回时挂机,应该就是Stack overflow问题。

当一块memory被破坏时,可以检查一下map文档,看看这块内存的前后各有什么用途,应该就是临近的内存使用不当。

当CPU发生address error时,在一些有address alignment的限制的CPU上,可能是在奇数位上操作了偶数个byte,此时应该要检查程序中指针的值。

如果堆被破坏了,可在任何地方调用“检查memory pool完整性”的函数,应该就可以找出程序中破坏堆的地方。

在嵌入式系统中,局部变量是没有初始化的,必须由程序设计师自己设定;如果没有设定局部变量的初值就直接使用的话,就可能发生每次执行结果都不同的现象。

在程序中要用到sizeof()取得变量或者文档结果真正占内存的size,不要自己想当然而直接写数字,否则很容易造成内存操作的错误。

在进行程序最佳优化之前,先要有一个稳定、可靠的版本:而且在这个版本最佳优化未完成之前,不要将程序加入正式版本之内。

调整编译器最佳化德等级;但务必记得一件事情,编译器无法帮助程序设计师完成所有最佳化的任务,尤其是程序风格不佳,或者写的零零落落的程序。

优先使用改良算法的手段来做效率调整;举例来说,无论再怎么精简程序,也无法弥补冒泡与快排之间的差距。

以空间换取时间;如果内存还有剩余的话,可以试着思考利用多余的内存空间来改良算法,进而改善效能。

不要把程序优化与“用汇编语言修改”混为一谈;首先应该找到程序的hot spot,也就是程序中效能的瓶壁所在,再利用所有你在学校学习到与优化有关的技巧来试着修改它。例如:
1、尽量改写程序中用到乘法、除法的计算部分,例如对2的N次方可以用到移位运算
2、最大限度地减少分支的数目与复杂度
3、在二维数组中要分清楚是行有限还是列优先
4、检查并尽量减少for/while循环内的迭代次数
5、把循环内一些东西可以提到外部尽量提出
5、把需要快算运算的东西放到快的存贮设备上运行

要考虑内存对齐问题,尤其是字符变量

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
五湖四海皆朋友
最近文章
浅谈MIPS的MMU(二)
2016-08-16 19:33:41
浅谈MIPS的MMU(一)
2016-05-05 10:55:06
推荐文章
最近访客