系统工程师/软件架构师在对软件系统进行故障排查时的公共技巧(Debugging的艺术)

系统工程师/软件架构师在对软件系统进行故障排查时的公共技巧(Debugging的艺术)

  • 从问题的log中使用特殊的关键词搜索Web,比如特殊的error信息,检查此问题是否别人也遇到过,并有解决方案;
  • 尝试基于bug的问题表现症状,设计关键词,在开源软件的上游bug数据库中寻找patch
  • 每次解决了新的问题,使用本地基于Lucene的索引系统保存,这样当以后如果觉得问题相似时,可以检索一下,之前是不是解决过这个问题(对于问题,我的原则是一旦解决过,就把它忘记,但是要做好记录)
  • 对于版本化管理的有源代码的系统,使用git bisect类似的二分查找技术来定位是不是regression bug;
  • 尝试寻找“有问题”和“没有问题”的2个副本,然后检查两者的差别在什么地方,这可以逐步缩小bug的范围;
  • 进一步,如果没办法找到“没有问题”的副本,那么就想办法自己造一个,譬如替换部分模块,不过这要求熟练的软件结构模块化的理解,以及软件裁剪编译构建的能力;
  • 对问题本身要有从症状建立合理的“故障模型”的能力,这称之为“猜想”,然后用实验去验证或者反驳;所谓的实验就是用最小的测试用例,来建立受控的运行环境,然后在特殊的执行路径上打log,以验证bug是不是就是那么发生的;
  • 了解C++代码常见的内存崩溃错误:空引用(null-ref)、引用了已释放的内存(use-after-free,UAF)、数组访问边界越界、堆溢出、栈溢出、数据竞争等等。空引用是最容易解决的,UAF在崩溃栈与代码对得上的情况下也很容易解决。内存溢出可以通过编译器选项调整,或者加入CHECK运行时宏。最麻烦的是崩溃栈对不上(编译器使用了內联优化,且内存遭到了非法修改,野指针破坏了内存布局)
  • Code Review:通过人脑的Type-Check和Naming-Convention违反来找到bad code smells
  • (高级技巧)使用脚本控制debugger,以分布式大批量地运行分支覆盖的受控自动化调试
  • (高级技巧)编写基于Clang的静态type-checker,发现潜在的源代码错误,或强制源代码编码规范
  • 学会使用内存调试工具和多线程安全调试工具,这类技术称为运行时打桩(instrumentation)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值