读书笔记:Effective+Debugging-软件和系统调试的66个有效方法

Effective+Debugging-软件和系统调试的66个有效方法
总结:全面的日志、代码逻辑全覆盖、简化逻辑和代码、网络搜索、合适的工具、从原理入手、二分法分析、版本管理、不同环境不同语言…

宏观策略
1、 事务追踪系统。类似JIRA系统。
2、 上网查相关问题。
3、 检查系统的输入输出。Eg:指针判断,值判断。考虑全覆盖各种可能的分支,在最近的地方暴露出问题、并及时处理问题。
4、 从具体问题入手向上追查b u g ,或从高层程序入手向下追查bug:第一种情况是程序崩溃,崩溃时调试、内存转储、特征值。第二种情况是程序冻结( freeze),死循环,查循环条件。第三种情况是程序在出现问题时发出了错误消息,日志、代码文件名行号。性能分析工具。
5、 在能够正常运作的系统与发生故障的系统之间寻找差别。用系统工具查差别,例如访问了什么文件、调用了什么dll。二分法差错。
6、 使用软件自身的调试机制。关闭部分功能,例如多线程。内置调试方法,例如在所有错误分支设置中断、assert等。调试机制,有些系统软件支持,例如:SQL 的 explain 机制。
7、 试着用多种工具构建软件,并将其放在不同的环境下执行。例如win10开发的放到winxp环境编译测试。不同的cpu架构。32、64位不同。
8、 把工作焦点放在最为重要的问题上。或许同类型的调查过一次,就应该从原理上杜绝。

通用的方法与做法
9、 相信自己能够把问题调试好。准备健壮的最小测试用例。自动化。用脚本来分析日志文件。了解 A P I 或语言特性的实际运作方式。
10、 高效地重现程序中的问题。测试程序。
11、 修改完代码之后,要能够尽快看到结果。简化、提高效率。
12、 将复杂的测试场景自动化。简化。
13、 使自己尽可能多地观察到与调试有关的数据。相关数据的比较。
14、 考虑对软件进行更新。第三方代码存在问题。
15、 查看第三方组件的源代码,以了解其用法。对源码的理解,避免错误的使用。
16、 使用专门的监测及测试设备。硬件测试,辅助测试硬软件。对全流程数据、逻辑、处理的调查。
17、 使故障更加突出。修改代码提高错误暴露概率。
18、 从自己的桌面计算机上调试那些不太好用的系统。好用的调试环境。
19、 使调试任务自动化。时间加速。环境模拟。脚本化测试。
20、 开始调试之前与调试完毕之后都要把程序清理干净。先把程序条理化,大部分bug都能暴露出来。
21、 把属于同一个类型的所有问题全都修复好。总结归纳,一次性处理同类问题。

通用的工具与技术
22、 用 Unix命令行工具对调试数据进行分析。Windows下可以考虑cygwin unix。
23、 掌握命令行工具的各种选项及习惯用法通用的工具与技术。
24、 用编辑器对调试程序时所需的数据进行浏览。
25、 优化工作环境。
26、 用版本控制系统寻找bug发生的原因及经过。
27、 用工具监测由多个独立程序所构成的系统。日志通过网络发到服务器分析。

调试器的使用技巧
28、 编译代码时把符号信息包含进来,以便于调试。Debug版本。Microsoft的编译器采用/Z i选项来嵌入调试信息。大多数Unix编译器都采用-g 选项来嵌入调试信息。
29、 对代码进行单步调试。
30、 设置代码断点和数据断点。
31、 了解反向调试功能。Vs调试时,拖到前面的代码,重复执行。
32、 查看例程之间的相互调用情况。vs调用栈。
33、 查看变量及表达式的值,以寻找程序中的错误。
34、 了解怎样把调试器连接到正在运行的进程上。
35、 了解怎样运用核心转储信息来进行调试。Windows MiniDumpWriteDump函数。把调用 MiniDumpWriteDump 的 那 个 函 数 ,作 为 参 数 传 给 SetUnhandledExceptionFilter 即可。
36、 把调试工具设置好。
37、 学会查看汇编代码及原始内存。

编程技术
38、 对可疑的代码进行评审,并手工演练这些代码。
39、 审读代码并与同事讨论。
40、 给软件添加调试机制。
41、 添加日志语句。
42、 对软件进行单元测试。
43、 用断言进行调试。
44、 改动受测程序,以验证自己的推想。
45、 尽量缩小正确范例与错误代码之间的差距。
46、 简化可疑代码。
47、 将可疑代码改用另外一种编程语言来写。
48、 改善可疑代码的可读性与结构。
49、 要清除bug的根源,而不仅仅消除其症状。

编译时的调试技术
50、 对生成的代码进行检视。
51、 使用静态程序分析工具。
52、 对项目进行配置,令程序能够以固定的方式构建和执行。
53、 对调试所用程序库及构建代码时所应执行的检查进行配置。

运行时的调试技术
54、 通过构建测试用例来寻找错误
55、 令软件在遇到问题时尽早退出
56、 检视应用程序的日志文件
57、 对系统和进程所执行的操作进行性能评测
58、 追踪程序的执行情况
59、 使用动态程序分析工具。valgrind工具。

调试多线程的代码
60、 通过事后调试来分析死锁问题,内存转储
61、 捕获并重现。Intel的 PinPlay/DrDebug Program Record/Replay Toolkit就属于此类工具。
62、 用专门的工具来探查死锁与竞争条件问题。F i n d B u g s 工具。Helgrind工具。
63、 把不确定的因素隔离出来,或将其移除
64、 检查资源争用情况,以解决与可伸缩性有关的问题
65、 用性能计数器寻找伪共享问题
66、 考虑用更为高级的抽象机制来重写代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值