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.找到问题根本原因并把属于同一类的问题解决掉

工具

……更新中……

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

7大决定决定服务器性能的指标,你测试过几个?

一,服务器PING值 PING测试在一定程度上可以代表服务器的宽带速度。 使用站长工具提供的Ping服务(http://ping.chinaz.com),来测试...

4625
来自专栏Android群英传

震惊!我逆向了Android代码居然看见……

1061
来自专栏EAWorld

微服务 to 变 or not to 变?

原著作者介绍: Viktor Farcic CloudBees资深顾问,熟悉多种编程语言,从最早的Pascal,Basic,ASP,C,C++,Perl,Py...

2937
来自专栏后端技术探索

58同城高性能移动Push推送平台架构演进之路

关于作者:孙玄,58赶集集团系统架构师,技术负责人,技术委员会架构组主任,也是58同城即时通讯、C2C技术负责人,负责58核心系统的架构以及优化工作。分布式系统...

2102
来自专栏.NET技术

正确理解CAP定理

  CAP的理解我也看了很多书籍,也看了不少同行的博文,基本每个人的理解都不一样,而布鲁尔教授得定义又太过的简单,没有具体描述和场景案例分析。因此自己参考部分资...

1152
来自专栏极客猴

高并发的那些事

"高并发"对后台开发同学来说,既熟悉又陌生。熟悉是因为面试和工作经常会提及它。陌生的原由是服务器因高并发导致出现各位问题的情况少之又少。同时,想收获这方面的经验...

3793
来自专栏互联网高可用架构

如何设计一款多场景分布式发号器(Vesta)

3313
来自专栏京东技术

京东价格保护高并发 | 七步走保证用户体验

2014年加入京东,负责京东财务退款及价格保护研发建设,擅长京东逆向流程场景、金额拆分计算、高并发下网站优化。

1313
来自专栏编程一生

实现一个自己的搜索引擎的初始规划

1594
来自专栏CSDN技术头条

高性能智能日志实践

本文作者是 Archanaa Panda ,从 2000 以来一直在软件开发(构架、设计和编程)团队担任 Java / JavaEE 构架师,目前立志于做一个与...

24610

扫码关注云+社区