Debug心得与大家一起分享
在程序即将发布前,你会遇见很多莫名其妙的死机、异常及不可重现的程序退出等bug。
在此我简要的把我最近及这几年中遇见的比较常见及棘手的bug,一一列举出来,以抛砖引玉,希望大家把自己在平时中好的debug方法贴出来与大家一起分享。
一、Release与debug环境下代码编译出来的差别:
大家可能经常遇见在debug环境下跑的很正常的程序,在release下就莫名其妙的挂机了,引起这种情况发生的原因很多,下面我将我最近开发中遇见的问题及解决方法一一列举出来。
1、 成员变量未初始化
一个大的项目有好几人甚至几十人开发,不同的开发经历及开发习惯,很容易忽略这个老生常谈的问题,但这往往是导致release下挂机debug下运行正常的罪魁祸首。那怎样揪出是谁,在什么地方忘记初始化成员变量了呢?
症状1:该问题引起的死机是必现的。
引起的原因:多为int、long型变量未初始化引起
解决方法:release下F5,重现bug,察看堆栈表可以找出引起挂机的工程及cpp文件。由于在release环境下无法看见个变量的真实值,你需将该工程设为调试模式(Vs2005直接在属性—配置属性—C/C++--优化—将“优化”选项设为禁用(/Od)即可,其他编译器你可以在网上搜索一下怎么配置)。
再次F5,重现bug,找出引起死机的那行代码,找出异常值(多为指针异常为空,多数是某int或long变量非法,即不是你真实像要得值),一步一步找出是在何处给该变量赋的值,最终会找到某成员变量未初始化的地方,将其初始化。
在此,可能有人会说,我把这些变量不可能出现的值过滤下,指针保护下,呵呵,在此我只是想告诉那些想真正找出问题所在的程序员该问题的原委。
再提醒哈,由于编译环境及不同的编译工具,此问题在release下并不一定必现。
总结:成员变量一定要记得初始化。
症状2:该问题引起的死机是必现的。
引起的原因:多为指针未初始化引起。删除了一个非空指针(常说的野指针)引起。
解决方法:F5找出引起程序直接退出的那行代码,将该指针初始化即ok。
总结:大家常知道该怎么做,但一段时间为写代码或工作进度赶得急,往往会把这些必须处理的问题为处理,但只要你能迅速的解决此问题还是能弥补的。^_^
因此,你一定要切记成员变量的初始化,其它变量声明后,也要记得初始化。
有新的咚咚要跟踪,今天暂写于此。待续……
年前写的,放在自己博客里