最近在看《Effective Debugging》,作者(Diomidis Spinellis)将30多年的系统开发和调试的经验融入到书中,从策略、方法以及工具等多维度展示给读者,可见作者功力深厚。本人将书中的宝贵经验和建议收录到本博客中,一是总结二是也是学习和实践。
Diomidis Spinellis总结了66个高效的方法,我们依次来看记录一下。
策略是解决问题的思考过程,我们首先要学会深度思考,从遇到问题、分析问题、给出解决方案这一系列的过程就是策略。问题的解决方案就是策略结果。
工具:gitlab/github 软件:JIRA/Bugzilla/Redmine 主要通过issue-tracking system将所有事务记录到这个系统中。这样可以方便的记录工作进展、软件版本发行与跟踪、work item优先级进而进行查缺补漏并从中进行总结。每一项事务都要通过SSCCE原则进行描述。
SSCCE:对事物给出一个言简意赅(short)、自足(self-contained)且确切(correct)的例子(example)。
在stackoverflow、stackexchange和google来解决你的问题,对你自己遇到的问题也需要通过SSCCE原则进行描述。将错误信息加粗或者打上双引号。
仔细检查程序的前置条件(输入)和后置条件(返回结果),null值,数据合法性、无效指针、资源释放问题等等。
如果问题表现明确,我们应该从具体问题出手,向上追查bug,即从自下而上查找错误(比如:程序崩溃、程序错误信息等情况)。 如果bug很难定位,那么应该自上而下查找错误。比如程序的性能、安全以及高可用方面。
#对每一行进行裁切从第四个字段开始显示
cut -d ' ' -f 4- file.log
系统之间对比,找出行为上的区别,将所有可能的因素都要考虑到(源代码、参数、环境变量、网络问题、版本问题等等)。
列举了三个常用的调试命令:
# 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"
根据软件本身所支持的调试机制进行调试,来排查和解决你的问题。
特别是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等高级语言重新实现它并反复对比。
并不是所有问题都值得去解决,优先级和版本迭代。
keynote 1.相信自己并确保问题可追踪并得到解决。 2.给调试工作流出足够的时间,学习工具、技术和方法。 3.安排好自己的工作环境,让自己沉侵其中不受干扰。 4.遇到难题没有思路时,建议放松一下听一下music或者睡一觉。
对于出现的问题进行高效的重现可以使你的工作得到简化。
使用一些构建工具可以使你修改完代码后里面能看到程序的执行结果。搭建一套快速的自动化构建及部署流程。
通过脚本对复杂的场景进行自动化,节省时间提高效率。
ctags -R .
sudo apt-get install glibc-source
负载测试、压力测试和模糊测试。
1.software shim 2.TeamView和Unix 下strace或者truss
寻找程序故障过程自动化
比如:log分为debug、release,断言、调试命令。。。。
……更新中……