如何有效的debug
Posted gufanyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何有效的debug相关的知识,希望对你有一定的参考价值。
本文旨在于总结和记录软件开发中有效的调试思路。
当测试人员向我报告一个严重的bug时,我应该如何去思考这个bug,如何有效的快速的精确的定位bug所处的代码位置,如何最优解的修正代码缺陷?
在运用经典的科学调试方法时,基本会经历如下步骤:
1. 通过可重复的试验收集数据(即复现bug,同时抓去log);
2. 根据相关数据的统计构造一个假说(即根据以往的经验来确定方向,定义问题的边界);
3. 设计一个实验来证明或者反证这个假说;
4. 实施实验以证明或者反证假说,不能只停留在假说;
5. 跟具需要重复以上步骤。
依据以上五个步骤提供一种有效的方法:
1. 将错误状态稳定下来;
2. 确定错误的来源--
a) 收集产生bug的相关数据;
b) 分析所收集的数据,并构造对bug的假设;
c) 确定怎样去证实或证伪这个假设,可以对程序进行测试;
d) 按照2 - c)确定的方法对假设做出最终结论
3. 修正bug;
4. 对所修补的地方进行测试;
5. 检测修正是否有引入新的问题。
那么针对android rom开发,可以用以上的方式来debug,对其他类型的软件开发一样适用,所不同的是调试技巧和工具不同,但是归根结底都是以上步骤的衍生。
只要明确了以上的五个步骤,在工程实践中面对80%的问题都会知道如何下手,首先就是分析现象和log来对bug分类,分类可以缩小缺陷代码的范围,同时也确定了分析方向,比如分events_log,如果确认是anr问题,那么我就知道要去分析anr log,如此就可以确定是死锁问题还是主线程操作i/o等耗时动作等。如果判断方向是tombstone,那么就去分析tombstone log,同时也就需要学习tombstone log的分析方法。
介绍Android 开发的调用栈打印方法:
1)Java 层:
Thread.currentThread().dumpStack(); //方法一
Log.d(TAG,new RuntimeException("----Exception----")); //方法二
new RuntimeException("----Exception----").printStackTrace(); //方法三
2)Native 层
#include<utils/CallStack.h>
android::CallStack stack(("----Native Exception----"));
利用调用栈就可以对代码逻辑进行分析,辅助我们理解代码的用意。比如需要分析android 手机启动时 PMS如何扫描system分区,安装系统应用的流程,就可以结合打印调用栈的方式来印证自己对代码逻辑的理解。
结合这些平台和语言的调试工具和行之有效的具有指导性的调试思路就可以对大部分bug进行分析,而不会觉得老虎吃天不知如何下嘴。
以上是关于如何有效的debug的主要内容,如果未能解决你的问题,请参考以下文章
为啥flutter build ios --obfuscate --split-debug-info= 失败并出现警告,但flutter build ios 有效?