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 条评论
登录 后参与评论

相关文章

来自专栏EAWorld

微服务 to 变 or not to 变?

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

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

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

4223
来自专栏Java职业技术分享

巧用分布式环境下的优雅技术,只有头发少的人才研究过

在分布式数据库系统中,用户感觉不到数据是分布的,即用户不须知道关系是否分割、有无副本、数据存于哪个站点以及事务在哪个站点上执行等。

850
来自专栏Android群英传

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

1351
来自专栏鸿的学习笔记

聊聊分布式系统的时钟问题

诸如此类的问题,还能提出很多,因此需要一个靠谱的时钟来保证分布式系统里事件的处理不会出错。

1541
来自专栏华章科技

从 Python 转到 Go 语言的五大理由

“ Python 是非常强大的,特别是 Python3 有了异步功能,但是 GO 将完全取代它在大企业中的存在…”如果你真正理解了引号中的话,你可能会去尝试 G...

1843
来自专栏京东技术

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

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

1393
来自专栏Golang语言社区

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

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

5265
来自专栏TechBox

模块化与解耦简述4. 解耦与通信5. 源码推荐

2753
来自专栏Java架构

高并发风控技术解密(下)

1954

扫码关注云+社区

领取腾讯云代金券