概述
本文持续更新,记录debug的岁月里的心(keng)得(die)。
1. 写完代码记得多看几次,避免手抖导致的错误。编译器可以检测出一些明显的错误,但是不能检测出一些问题,比如
a[recv] = x;
a[send] = y;
写成了:
a[recv] = x;
a[recv] = y;
或者
a[recv] = x;
a[recv] = x;
不仔细看,在一大堆代码里有时候真的很难找。
2. 慎用memcpy相关API,可能存在的问题包括:
(1)覆盖了已有内存
(2)内存越界
3. 对于静态库和动态库的调用,救急建议百度,长期解决问题建议看《程序猿基本素养》和《深入理解操作系统》
4. 不要用不必要的变量和内存,尽量精简代码,哪怕电脑性能再优越。less is more
5. 多查google,比百度靠谱多了,尤其是稀少的资料。stackoverflow是个好东西
6. 对于复杂的问题,将其拆分成很多小问题一个个解决更为方便。比如做一个异步proactor的收发DHT节点,将其拆分为:先做一个简单的proactor模型,增加socket通信,修改收发端,完善功能等等一步步来会更好,不然一口吃个胖子显然会噎死自己,除非非常牛叉。
7.网络字节序和主机字节序一定要严格按要求转换,不可随意使用。
8.很多开源库都有自建的测试代码样例,通过这些样例可以学习、仿写开源库的使用。
9. 理想的结构体可以通过两种方式支持用户自定义数据:第一种是void *userdata,第二种是结构体最后添加柔性数组data[0]。这两种如果在开源库的结构体看到了,则可以在其中存放自己想保存的东西。
10. 没有什么问题是增加中间层不能解决的,有的话就再增加一层。-------------介于这种思想,我们自己写动态库/静态库的时候一定要和上层隔离开,即测试代码应位于上层,不受动态库/静态库的影响。
11.接第8条,使用某些开源库的时候,如果官方提供了测试程序,则优先调通该程序。通过该程序可以学习开源库的使用技巧,并由此来慢慢了解源码并阅读源码。有些测试程序也许会有坑,但这是好事,通过踩坑发现坑解决坑你会发现对开源库的了解深入到了一定的层次。
12.异步程序调试经常会非常的繁杂,逐步断点调试往往得不到理想的答案,反而会造成更多的问题或者陷入无穷无尽的汇编、库里迷失了自我。在这种情况下最好的办法是冷静下来思考整个流程、逻辑,配合着不厌其烦的打印,并严格的检查每一条语句(最好以陌生人的视角来看自己的代码)。
13. 假设定义了一个指针函数,我们在一个类中建立该指针函数类型的回调函数时,需要使用静态类成员函数才可以,否则会因为识别出错而报错。
14. 代码在debug的时候可以有多级Log输出,但是一旦要提交出去给用户用,千万要注意LOG的分级,保证不输出大量无效LOG造成用户的困扰
15. 修改代码的时候千万不能忘记修改注释,做到代码和注释的统一,否则将造成一些不必要的后果
16. 做好代码的备份,随时写随时备份,以免revert/commit/merge后无法找回源码
17. 做好自测,永远不要依赖于测试人员。自测的时候尽可能的全面,努力保证代码稳定无误
18. 写一个复杂功能的时候,拆分为多个小功能依次实现并测试完成再继续添加,如同搭积木一般。这样可以最大程度的提高效率,一个项目拖太久了就会失去动力了。
19. 使用涉及指针的时候千万注意,将多个指针指向同一内存时,一个指针的操作可能导致其他指针发生问题。简言之,谨慎使用指针,谨慎使用内存操作,如memcpy, memset等。
最后
以上就是笑点低电灯胆为你收集整理的debug心得(持续更新)的全部内容,希望文章能够帮你解决debug心得(持续更新)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复