Effective Debugging-高效调试

时间:2022-05-06
本文章向大家介绍Effective Debugging-高效调试,主要内容包括概述、Effective Debugging-高效调试、方法、工具、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

概述

最近在看《Effective Debugging》,作者(Diomidis Spinellis)将30多年的系统开发和调试的经验融入到书中,从策略、方法以及工具等多维度展示给读者,可见作者功力深厚。本人将书中的宝贵经验和建议收录到本博客中,一是总结二是也是学习和实践。

Effective Debugging-高效调试

Diomidis Spinellis总结了66个高效的方法,我们依次来看记录一下。

策略

策略是解决问题的思考过程,我们首先要学会深度思考,从遇到问题、分析问题、给出解决方案这一系列的过程就是策略。问题的解决方案就是策略结果。

1.通过issue-tracking system处理所有问题

工具:gitlab/github 软件:JIRA/Bugzilla/Redmine 主要通过issue-tracking system将所有事务记录到这个系统中。这样可以方便的记录工作进展、软件版本发行与跟踪、work item优先级进而进行查缺补漏并从中进行总结。每一项事务都要通过SSCCE原则进行描述。

  • short
  • self-contained
  • correct
  • example

SSCCE:对事物给出一个言简意赅(short)、自足(self-contained)且确切(correct)的例子(example)。

2.通过互联网来解决你的问题进而总结

stackoverflow、stackexchange和google来解决你的问题,对你自己遇到的问题也需要通过SSCCE原则进行描述。将错误信息加粗或者打上双引号

3.确保准入(前置条件)准出(后置条件)得到满足

仔细检查程序的前置条件(输入)和后置条件(返回结果),null值,数据合法性、无效指针、资源释放问题等等。

4.自下而上或者自上而下追查bug

如果问题表现明确,我们应该从具体问题出手,向上追查bug,即从自下而上查找错误(比如:程序崩溃、程序错误信息等情况)。 如果bug很难定位,那么应该自上而下查找错误。比如程序的性能、安全以及高可用方面。

5.在预发(发生故障)和测试系统(正常运行)寻找差别

#对每一行进行裁切从第四个字段开始显示
cut -d ' ' -f 4- file.log

系统之间对比,找出行为上的区别,将所有可能的因素都要考虑到(源代码、参数、环境变量、网络问题、版本问题等等)。

6.使用自身的调试命令

列举了三个常用的调试命令:

# unix shell -x 选项详细展示shell所执行的命令。
sh -x command
# ssh调试问题
1.先在服务端-d来启用调试,-p指定所使用的端口避免冲突。
sudo sshd -f sshd_config -d -p 222(port)
2.客户端需要和服务端的端口保持一致
ssh -p 222 xxx.xxx.com
# mysql性能问题分析通过explain
explain select count(names) from table where au_id = 1
explain select count(names) from table where create_at = "2017-01-22 12:11:11"

根据软件本身所支持的调试机制进行调试,来排查和解决你的问题。

7.使用构建tool在不同环境下执行

特别是C/C++开发环境下,对操作系统编译器的支持都需要在不同环境执行看一下程序结果。注意字节、内存对齐等问题。 作者给出了几点建议: 1..net framework不仅使用Microsoft的开发工具也要使用Mono。 2.对Ada,C,C++,Object-c等程序需要通过LLVM和GCC这两种编译器执行。 3.java应用同时使用openjdk。 4.开发Ruby程序时,多尝试其他VM。 5.当你使用了较为低级语言完成了一个算法时,发现无法运作可以使用Python,R,Haskell,shell等高级语言重新实现它并反复对比。

8.主要精力解决主要问题

并不是所有问题都值得去解决,优先级和版本迭代。

方法

9.相信能解决好该问题

  • 编写健壮的单元测试或者测试用例
  • 对bug重现及自动化。
  • 高效的方法分析日志
  • 了解运作方式和业务逻辑

keynote 1.相信自己并确保问题可追踪并得到解决。 2.给调试工作流出足够的时间,学习工具、技术和方法。 3.安排好自己的工作环境,让自己沉侵其中不受干扰。 4.遇到难题没有思路时,建议放松一下听一下music或者睡一觉。

10.高效的重现程序中的问题

对于出现的问题进行高效的重现可以使你的工作得到简化。

11.修改完代码尽快看到所修改程序的结果

使用一些构建工具可以使你修改完代码后里面能看到程序的执行结果。搭建一套快速的自动化构建及部署流程。

12.复杂的测试场景自动化

通过脚本对复杂的场景进行自动化,节省时间提高效率。

13.尽可能看到与你调试相关的数据

14.考虑软件及时更新避免bug或者安全问题

15.查看开源或者第三方组件源代码,了解其用法。

ctags -R .
sudo apt-get install glibc-source

16.使用专门的测试设备

17.使故障更加突出

负载测试、压力测试和模糊测试。

18.通过友好终端去调试非友好系统

1.software shim 2.TeamView和Unix 下strace或者truss

19.使得调试自动化

寻找程序故障过程自动化

20.调试之前和完成后将程序清理干净

比如:log分为debug、release,断言、调试命令。。。。

21.找到问题根本原因并把属于同一类的问题解决掉

工具

……更新中……