Release下随机出现问题分析定位(Windows下)

来源:互联网 发布:saber仿真软件 编辑:程序博客网 时间:2024/06/05 00:51

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)


最近碰到一个问题:Release随机出现,Debug下不出现的问题

1 分析的时候采用方法:

A.  先界定问题范围:通过进一步去掉影响因素,缩小定位问题的范围,例如

    a.  减少排查范围:用例中有很多元素,可以尝试删除掉某类元素,从而进一步减少排查范围

    b.  确立排他条件:其他类元素同等条件会不会出问题

B. 添加日志代码跟踪:一步一步逼近问题点

    界定范围之后,开始在预期出错的范围中添加日志,添加日志->重现->分析  -->添加日志-->重现-->分析 ... ,一步一步逼近问题点


2. 日志分析方法:

因为是随机问题,有正确的情况,也有错误的情况;拿出错误的和正确的日志两相对比,就可以确定出错的范围在哪一块了。


3. 最终定位的结果是:

类中一个int变量使用时未初始化,导致Release时随机值;

形如myClass.num,使用的(myClass1.num > myClass2.num)判断的。


4. 问题为什么会产生,为什么Debug时不重现?

在VS下面调试时,查看内存的信息,可以看到,对于未初始化的内存,VS缺省初始化内存中存储的是形如下面的值:

0x2074A901  cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc (这个也是咱们做VS调试时,经常看到的 0x cccc cccc值,变量未初始化时,存储的就是这个值。)

在Debug时,由于形如myClass.num是没有初始化的,myClass1.num > myClass2.num两个变量的值都是 0x cccc cccc,比较的结果是相等,是一个恒定值,所以不会出现随机情况。

但对于Release情况就不同了,内存没有初始化置值,随机的值,所以比较结果也是随机的。


5. 后续如何快速的找出这种问题的原因并解决

关于这个问题,不同情况确实没有恒定的方法。不过有些思路可能有助于帮忙

a. 下次碰到Release随机重现,Debug不重现,要首先想到是 “变量未初始化的问题"

b.  尽早界定问题范围,方法参考第1节中

c. 对于界定到的范围,如果有思路,可以在debug下跟踪,查看有没有成员变量的值是 0x cccc cccc (用于检查是否初始化)

d. 如果没有解决的话,开始采用打日志方法来分析问题


6. 建议写代码时,对新增代码做静态检查:通过静态检查查该类变量未初始化的问题效率较高,切防患于未然。


(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)



0 0
原创粉丝点击