【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

如何有效地调试软件

  • 2016-06-12
  • 本文字数:1713 字

    阅读完需:约 6 分钟

Diomidis Spinellis 是《代码阅读与代码质量》一书的作者。在 GOTO 阿姆斯特丹 2016 大会上,他就如何有效地调试软件和预防错误做了演讲。

InfoQ 采访了 Spinellis ,内容涉及发现和修复软件中的错误、软件调试的原则、如何提高调试效率、如何编写出不怎么需要调试的代码以及管理人员如何为错误预防和处理提供支持。

InfoQ:是什么让软件错误的发现和修复如此困难?

Diomidis Spinellis:如果你认为编写代码困难,那就尝试下代码调试吧。你编写了一个新的函数或方法,并加上一些语句形成某个只是貌似正确的东西。当你调试一个程序的时候,你要面对数千或数百万行貌似正确的代码,并设法找出其中的错误。这必定要困难许多。然后,你还要应对各种系统和层次之间的复杂交互、每秒执行数十亿次的 CPU 指令、难以再现的 Bug 以及来自生产环境系统的压力。

而且,课堂上很少教调试;从一切可能出错的东西辛苦得来的经验很难压缩到一次演讲中。此外,由于系统失败的方式各不相同,你必须不断地改进和调整你所用的工具和方法。你可以从观察开始,继之以数据分析,然后做一些试验,最后推断出 Bug 的原因。没有什么标准的初学者技能。

InfoQ:软件调试有什么一般原则吗?

Spinellis:很遗憾,由于软件会出现各种难以想象的错误情况,我不认为有什么可以在软件调试过程中遵循的一般原则。退而求其次,我归纳出了三大类方法:

  • 高级策略,比如由故障特征推断出原因,或者确保某些代码满足了其前提条件;
  • 方法和实践,比如确保 Bug 可以有效地再现,或者着重突出故障的影响;
  • 通用工具,比如 Unix 命令行工具、跟踪(考虑下 strace、dtrace 和 systemtap)工具和版本控制系统。

InfoQ:程序员做什么能够提高调试效率?

Spinellis:首先要为调试成功做好准备。让自己相信问题将会得到解决,留出足够的时间用于调试,不要分心,要坚持不懈,必要的时候,留待第二天解决。重要的是,要不断地在环境、工具和知识上投入。购买高效工作所需的软件和硬件。例如,如果软件生成大量的调试日志文件,你就应该有足够的磁盘空间、CPU 处理能力和带宽,以便可以高效地处理它们。在调试的过程中,你很容易遇到千奇百怪的问题,因此,花些精力管理和优化自己的环境和工具配置。这包括按键绑定、别名、辅助脚本、快捷方式和工具配置;所有这些都可以显著地提高调试生产力。

InfoQ:有什么技术或方法可以编写出不怎么需要调试的代码吗?

Spinellis:当然!编写可维护的代码——可读、稳定、易于分析和修改的代码——带来的 Bug 也比较少。此外,像单元测试、代码审查这样的方法以及使用断言都有助于最小化进入生产环境的错误。

在设计时使用高级抽象(例如使用一个框架的算法或容器数据结构,而不是选择自己开发一种方案)可以减少代码和错误。另外,让程序易于调试也很重要。这包括为详细地记录日志提供便利,当出现内部错误时报告丰富的上下文信息,并将问题及崩溃的详细信息发送到一个中央存储库。

InfoQ:管理人员如何为组织里的错误预防和处理提供支持?

Spinellis:设定基本的过程有助于确保软件错误不会失控。部署并采用一个问题跟踪系统,用它把要处理的问题分类并排定优先级。将软件变更恰当地记录在进一个运作良好的版本管理系统里,并将它与问题跟踪系统联系起来;我经常仅仅通过仔细研究一个文件的历史和变更就修复了 Bug。在软件建设方面,推广单元测试的应用,把软件的构建性能分析、静态分析和动态分析包含进来,并维护一个快速、精益、均衡的构建 - 测试周期。这有助于帮助开发人员尽早捕获 Bug,并迅速修复。最后,在运维方面,逐步部署软件,允许新旧版本对比,努力确保所使用的工具和所部署的环境的多样性,并有组织地升级工具和库。

GOTO 阿姆斯特丹 2016 大会将于 6 月 14 日 -15 日举行。这是一个由从业者推动的企业级软件开发大会,面向团队负责人、架构师和项目管理人员。InfoQ 将以 Q&A、概述、文章的形式进行报道。

Diomidis Spinellis 是雅典经济与商业大学的一名教授,同时也是 IEEE Software 的总编辑以及《代码阅读与代码质量》一书的作者。他的新书 _ Effective Debugging: 66 Specific Ways to Debug Software and Systems _ 将在 2016 年 6 月 1 日发行。

查看英文原文 How to Effectively Debug Software

2016-06-12 19:001798
用户头像

发布了 1008 篇内容, 共 374.0 次阅读, 收获喜欢 340 次。

关注

评论

发布
暂无评论
发现更多内容

盲盒开发盲盒小程序开发

黄东旭:写给后端程序员看的认知心理学丨Go+ 1.0 发布会干货分享

七牛云

Go 语言

HarmonyOS 3.0.0开发者预览版全新发布

HarmonyOS开发者

HarmonyOS ArKUI 3.0 ArkCompiler 3.0

盲盒开发源码搭建小程序app

阿里IM技术分享(六):闲鱼亿级IM消息系统的离线推送到达率优化

JackJiang

架构设计 即时通讯 IM

Microsoft SQL Server 迁移利器,Babelfish for Aurora PostgreSQL 上线!

亚马逊云科技 (Amazon Web Services)

数据库 开源 源代码

【体验有礼】Serverless 极速搭建 Hexo 博客

阿里巴巴中间件

阿里云 Serverless 云原生 Hexo 中间件

基于Guava API实现异步通知和事件回调

Tom弹架构

Java 架构 设计模式

无处不在的 Kubernetes,难用的问题解决了吗?

阿里巴巴中间件

阿里云 Kubernetes 容器 云原生 中间件

盲盒开发盲盒app开发

参会指南 | 2021MongoDB南京技术沙龙

MongoDB中文社区

mongodb

iOS开发面试和底层学习视频整理合集

iOSer

ios iOS面试 ios开发 iOS视频学习 iOS涨薪

【高并发】通过源码深度分析线程池中Worker线程的执行流程

冰河

Java 并发编程 多线程 高并发 异步编程

17 K8S之容器资源需求与资源限制

穿过生命散发芬芳

k8s 11月日更

Go+ Together!Go+ 1.0 发布会暨 Go+ 开发者基金会启动仪式圆满结束!

七牛云

Go 语言

vue3 学习笔记 (一)——mixin 混入

码仔

Vue3 mixin

干货分享:细说双 11 直播背后的压测保障技术

阿里巴巴中间件

阿里云 云原生 中间件 全链路 PTS

许式伟:Go+ v1.x 的设计与实现丨Go+ 公开课 • 第一期

七牛云

Go 语言 goplus

明道云商业化成果巡礼|2021年11月

明道云

为AI另辟蹊径的“小”数据

澳鹏Appen

人工智能 大数据 小数据 数据标注 训练数据

盲盒开发小程序app开发源码搭建

拒绝编译等待 - 动态研发模式 ARK

字节跳动终端技术

ios 字节跳动 移动开发

林昊:开发者如何提升写代码的硬实力丨Go+ 1.0 发布会干货分享

七牛云

Go 语言

程序员的硬核浪漫 — 女友专属语聊房(内附源码)

ZEGO即构

音视频 语聊房 demo源码 即构科技

单机训练6000万类视觉分类模型,飞桨大规模分类库PLSC做到了

百度开发者中心

飞桨 视觉分类 plsc

【强势推出】专家带你玩,秒懂数据库!官方证书、万元奖品带回家!

华为云数据库小助手

GaussDB GaussDB(for openGauss) 华为云数据库

恒源云(GPUSHARE)_基于梯度的NLP对抗攻击方法

恒源云

人工智能 深度学习

许式伟:Go+ Together丨Go+ 1.0 发布会干货分享

七牛云

Go 语言

网易云信发布虚拟形象实时互动融合 SDK ,元宇宙大幕即将开启

网易云信

人工智能 数字化 元宇宙

如何在浏览器 console 控制台中播放视频?

CRMEB

原因揭秘!为什么选择 Pulsar 而非 Kafka

Apache Pulsar

kafka 开源 架构 分布式 Apache Pulsar

如何有效地调试软件_文化 & 方法_Ben Linders_InfoQ精选文章