fbpx

[email protected]

购物车

 查看订单

  • 我的帐户
东东购 | EasternEast
  • 中文书店
    • 畅销排行榜
      • 小说 畅销榜
      • 童书 畅销榜
      • 外语畅销榜
      • 管理畅销榜
      • 法律畅销榜
      • 青春文学畅销榜
    • 热门分类
      • 社会小说
      • 成功/励志 畅销榜
      • 人物传记
      • 大陆原创
      • 绘本童书
      • 影视小说
    • 文学推荐
      • 文集
      • 戏剧
      • 纪实文学
      • 名家作品
      • 民间文学
      • 中国现当代随笔
    • 新书热卖榜
      • 小说 新书热卖榜
      • 青春文学 新书热卖榜
      • 童书 新书热卖榜
      • 管理 新书热卖榜
      • 成功/励志 新书热卖榜
      • 艺术 新书热卖榜
  • 精选分类
    • 小说
    • 保健养生
    • 烹饪/美食
    • 风水/占卜
    • 青春文学
    • 童书
    • 管理
    • 成功/励志
    • 文学
    • 哲学/宗教
    • 传记
    • 投资理财
    • 亲子家教
    • 动漫/幽默
    • 法律 Legal
    • 经济 Economics
    • 所有分类
  • 关于东东
  • 帮我找书
搜索
首页计算机/网络软件工程/开发项目管理Effective Debugging英文版:调试软件与系统的66个有效方法

Effective Debugging英文版:调试软件与系统的66个有效方法

作者:(希腊)Diomidis Spinellis (季奥米季斯·斯宾奈里斯) 著 出版社:电子工业出版社 出版时间:2017年06月 

ISBN: 9787121315312
年中特卖用“SALE15”折扣卷全场书籍85折!可与三本88折,六本78折的优惠叠加计算!全球包邮!
trust badge

EUR €46.99

类别: 软件工程/开发项目管理 SKU:5d840b2c5f98491045404125 库存: 缺货
  • 描述
  • 评论( 0 )

描述

开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121315312丛书名: 原味精品书系

编辑推荐

•  《代码阅读》《代码质量》作者、IEEE Software主编Diomidis Spinelli再出力作。

•  经典原味,解决多种软件故障。

•  全面看待程序错误,加快调试进程。

 

内容简介
本书作者着眼于一系列可能会在现代软件系统中出现的问题,特别是分散在地球上的组件和服务之间复杂的相互影响造成的问题。无论您是否正在调试独立运行的错误或灾难性的企业系统故障,本指南将帮助您更快更少痛苦地完成任务。
作者简介

  Diomidis Spinellis是雅典经济与商业大学科技管理学院教授。他的研究领域包括软件工程、IT安全以及云系统工程。他的著作《代码阅读》(Code Reading: The Open Source Perspective)以及《代码质量》(Code
Quality: The Open Source Perspective)双双荣获Jolt(软件开发生产力)大奖并被广泛传译。Spinellis博士曾在多个学术期刊以及期刊会议论文集中发表了200多篇技术论文,被引用次数高达2500多次。十年来,他作为IEEE Software编委会的一员,为Tools of the Trade专栏定期撰稿。他为OS X以及BSD UNIX贡献了很多代码,并且是UMLGraph、CScout,以及其他软件开源包、库和工具的开发者。他拥有伦敦帝国理工学院软件工程专业的硕士学位及计算机科学专业的博士学位。他是ACM以及IEEE的高级会员,并且自2015年以来一直担任IEEE Software的主编。

目  录
目录
前言 v
致谢 x
作者简介 xiv
Figures xix
Listings xx
Item 11: Minimize the Turnaround Time from Your Changes to Their Result 28
Item 12: Automate Complex Testing Scenarios 29
Item 13: Enable a Comprehensive Overview of Your Debugging Data 32
Item 14: Consider Updating Your Software 33
Item 15: Consult Third-Party Source Code for Insights on Its Use 34
Item 16: Use Specialized Monitoring and Test Equipment 36
Item 17: Increase the Prominence of a Failure’s Effects 40
Item 18: Enable the Debugging of Unwieldy Systems from Your Desk 42
Item 19: Automate Debugging Tasks 44
Item 20: Houseclean Before and After Debugging 45
Item 21: Fix All Instances of a Problem Class 46
Chapter 3: General-Purpose Tools and Techniques 49
Item 22: Analyze Debug Data with Unix Command-Line Tools 49
Item 23: Utilize Command-Line Tool Options and Idioms 55
Item 24: Explore Debug Data with Your Editor 57
Item 25: Optimize Your Work Environment 59
Item 26: Hunt the Causes and History of Bugs with the
Revision Control System 64
Item 27: Use Monitoring Tools on Systems Composed
of Independent Processes 67
Chapter 4: Debugger Techniques 71
Item 28: Use Code Compiled for Symbolic Debugging 71
Item 29: Step through the Code 76
Item 30: Use Code and Data Breakpoints 77
Item 31: Familiarize Yourself with Reverse Debugging 80
Item 32: Navigate along the Calls between Routines 82
Item 33: Look for Errors by Examining the Values
of Variables and Expressions 84
Item 34: Know How to Attach a Debugger to a Running Process 87
Item 35: Know How to Work with Core Dumps 89
Item 36: Tune Your Debugging Tools 92
Item 37: Know How to View Assembly Code and Raw Memory 95
Chapter 5: Programming Techniques 101
Item 38: Review and Manually Execute Suspect Code 101
Item 39: Go Over Your Code and Reasoning with a Colleague 103
Item 40: Add Debugging Functionality 104
Item 41: Add Logging Statements 108
Item 42: Use Unit Tests 112
Item 43: Use Assertions 116
Item 44: Verify Your Reasoning by Perturbing the
Debugged Program 119
Item 45: Minimize the Differences between a Working Example
and the Failing Code 120
Item 46: Simplify the Suspect Code 121
Item 47: Consider Rewriting the Suspect Code
in Another Language 124
Item 48: Improve the Suspect Code’s Readability and Structure 126
Item 49: Fix the Bug’s Cause, Rather Than Its Symptom 129
Chapter 6: Compile-Time Techniques 133
Item 50: Examine Generated Code 133
Item 51: Use Static Program Analysis 136
Item 52: Configure Deterministic Builds and Executions 141
Item 53: Configure the Use of Debugging Libraries and Checks 143
Chapter 7: Runtime Techniques 149
Item 54: Find the Fault by Constructing a Test Case 149
Item 55: Fail Fast 153
Item 56: Examine Application Log Files 154
Item 57: Profile the Operation of Systems and Processes 158
Item 58: Trace the Code’s Execution 162
Item 59: Use Dynamic Program Analysis Tools 168
Chapter 8: Debugging Multi-threaded Code 171
Item 60: Analyze Deadlocks with Postmortem Debugging 171
Item 61: Capture and Replicate 178
Item 62: Uncover Deadlocks and Race Conditions with
Specialized Tools 183
Item 63: Isolate and Remove Nondeterminism 188
Item 64: Investigate Scalability Issues by Looking at Contention 190
Item 65: Locate False Sharing by Using Performance Counters 193
Item 66: Consider Rewriting the Code Using Higher-Level
Abstractions 197
Web Resources 207
Index 211
前  言

在开发软件或者管理软件系统时,经常会遇到各种故障。这些故障的类型多种多样,一些是可以迅速解决的代码错误,还有一些可能会给公司造成每小时上百万元的损失——如大型系统的宕机。对于以上两种情况,作为一名高效的专业人士,要能够快速识别并修复这些故障。这就是调试的含义,也是本书的主题。

本书并非用于入门,面向的是有经验的开发人员,所以希望你能够理解用多种不同的编程语言编写的小型代码示例,并且可以使用高级图形用户界面和基于命令行的编程工具。但是,本书中仍然包含了详细的调试技术,因为我所见到的一些资深开发人员,即便其熟练地掌握了各种方法,也时不时地需要参考资料。此外,如果你曾经从事过至少几个月的正经调试工作,就能更容易地体会到书中先进的方法。

本书包含的内容

如本书主题,调试工作指的是在开发和运行一个现代化、精密化的计算系统时所用到的策略、工具和方法。在以前,调试主要指的是检测和修正程序错误。然而,现在的程序很少独立运行。即使小的程序也常常与外部库动态链接。复杂的程序会在应用服务器上运行、调用网络服务、使用关系型数据库或者 NoSQL 数据库、从目录服务器上获取数据、运行外部程序、利用中间应用程序并集成大量的第三方软件包。完整的系统和服务的运行依赖于散布在全球主机上的无故障运行、内部开发的第三方组件。软件开发原则 DevOps 能够解决这一现实问题,它强调了开发人员和其他 IT 专业人士的角色。本书旨在帮助你全面看待程序错误,因为对于挑战性的难题,通常很难立即确定软件中的罪魁祸首。

本书从一般性话题出发,引出具体的问题。第 1 章的内容是“策略”,第 2 章的内容是“方法”,第 3 章介绍了可以调试不同软件和系统故障的工具和技术。之后,书中还列举了针对调试工作不同阶段的技术,如使用调试器的阶段(第4章)、编程阶段(第5章)、编译软件阶段(第6章),以及运行系统阶段(第7章)。关于多线程和并发代码中那些麻烦的程序错误,第8章的内容单独涵盖了专门的工具和技术。

如何使用本书

一般情况下,读书都是从头看到尾。但实际上,还有更好的方法。本书中的建议分为以下三类。

,在面对程序错误时要用到的策略和方法。这方面的内容在第 1 章和第 2 章中都有罗列。此外,第 5 章中的许多技巧也可归于这一类别。多了解其中的内容,在应用时就可手到擒来。在调试过程中,整体性的思想会反映到你所使用的方法上。遇到“死胡同”时,回想一下已知路径,一般能帮助你找到走出迷宫的新路径。

第二,可以寄予希望的技术和工具。这些内容主要集中在第 3 章,其中也包含了解决日常问题的各个要素。具体参见“第 36 条:调整你的调试程序”。你需要找时间学习并逐步把这些条目运用到实践当中。这可能意味着放弃自己熟悉的工具,重新学习更先进的工具。刚开始时,这种经历可能会很痛苦,但是从长远来看,它将会把你塑造成为一名卓越大师。

第三,在面对困难问题时的技术应用思考。这些技术和方法都不会是你常常使用的,但是在遇到一个无从下手的难题时,它们能够节省你一天(或至少几个小时)的时间。举个例子,如果你无法解释为什么C代码或C 代码编译失败,你就可以参阅“第50条:检查生成代码”。在快速阅读这些条目时,你可以把它们作为参考,在之后的应用过程中,再仔细甄别。

如何投身编程世界

尽管书中的所有条目都是对诊断错误和调试已有错误提供建议,但是你仍可以利用从这里学到的大部分知识来尽量减少遇到软件故障的情况,也可以有能力解决突发状况,让生活变得更简单。严格的调试和软件开发实践相互促进,这是一个良性循环。这条建议对你现在或将来的软件开发、设计和管理都大有裨益。

在软件设计中,请遵循以下建议。

?       使用合适的机制(第
47 条:考虑用另一种语言重写可疑代码,第 66 条:考虑用更高层抽象进行重写)。

?       提供调试模式(第 6 条:使用软件的调试功能,第
40 条:添加调试功能选项)。

?       提供监控和记录系统运行的机制(第 27 条:对系统各个独立进程进行监视,第 41条:添加日志语句,第 56 条:检查应用程序日志文件)。

?       引入 UNIX 命令行工具脚本组件选项(第
22 条:使用 UNIX 命令行工具分析调试数据)。

?       确保是由于内部错误引发的明显故障,而非系统不稳定(第 55 条:快速故障)。

?       提供一种方法来获取事后问题分析所需的内存转储(第 35 条:知道如何利用磁心信息转储,第 60 条:使用后期调试分析死锁)。

?       缩小软件执行中的问题源头和非确定性范围(第 63 条:隔离与移除非确定性)。

在软件构建中,请遵循以下建议。

?       从同事那里获取反馈(第
39 条:与同事检查并推理代码)。

?       给每个程序创建单元测试(第
42 条:使用单元测试)。

?       使用断言(assertion)来验证你的假设和代码是否能够正确运行(第43条:使用断言)。

?       尽量编写可维护的代码,即可读、稳定、易于分析和修改的代码(第 46 条:简化可疑代码,第 48 条:提高可疑代码的可读性和结构性)。

?       避免构建中存在的非确定性源(第 52 条:配置确定性构建和执行)。

后,无论是团队还是个人管理软件的开发和运行,需要遵循以下几点。

?       记录问题,并使用合适的系统进行检验(第 1 条:使用问题追踪系统来处理所有问题)。

?       分流并给所有问题划分优先级(第 8 条:专注于重要的问题)。

?       在维护良好的修订控制系统中记录软件的所有更改(第 26 条:使用修订控制系统记录成因和调试历史)。

?       采用渐进方式部署软件,以便对新老版本进行对比(第 5 条:找出已验证系统和失败系统间的差异)。

?       力求所用工具和部署环境的多样性(第 7 条:为软件构建和执行环境拓展多样性)。

?       定期更新工具和库(第 14
条:考虑更新软件)。

?       购买所用的第三方库的源代码(第 15 条:参阅第三方源代码,深入理解第三方应用),同时,购买更高级的工具来诊断难以察觉的错误(第 51 条:使用静态程序分析,第 59 条:使用动态程序分析,第 62 条:运用专门工具解开死锁和竞态条件,第 64 条:调查源于争用的可扩展性问题,第 65 条:使用性能计数器共享
定位错误)。

?       对任何硬件界面和嵌入式系统的调试提供专业工具包(第 16 条:使用专业的监测和测试设备)。

?       使开发人员能够远程调试软件(第 18 条:从桌面开启对难以移动的系统的调试工作)。

?       为高要求的排查任务提供性能充足的CPU和磁盘资源(第 19 条:自动调试任务)。

?       在代码检查和指导方面鼓励开发人员的协作(第 39 条:与同事检查并推理代码)。

?       鼓励推动使用测试驱动开发(第 42 条:使用单元测试)。

?       纳入软件构建的性能概况、静态分析和动态分析,同时保持快速、精益、平均的构建和测试周期(第 11 条:小化从修改到结果的换向时间,第 51 条:使用静态程序分析,第 53 条:配置使用调试库和检测,第 57 条:廓线系统和运作流程,第59 条:使用动态程序分析工具)。

关于术语的一些说明

本书中,在ISO-24765-2010(系统和软件工程——词汇)定义范围内使用fault一词:“计算机程序中一个不正确的步骤、进程或者数据定义”。这常被称为defect。在日常语言中,就是通常所说的bug。同样地,我所使用的术语failure是根据同一标准:“系统或系统组件不能在规定限度内实现应用功能”。故障的表现有程序崩溃、锁死,或给出错误的结果。因此,在有fault的情况下,就会出现failure。令人困惑的是,有时fault和defect也会用来指代failure,ISO标准已经意识到了这个问题。本书中,我会遵守这一区别。然而,为了避免把内容变成法律条文那样,在上下文很清楚的情况下,我通常用problem一词来指代fault(即代码中的问题)或failure(即可复现的问题)。

如今,UNIX操作系统的shell、库和工具可以在许多平台上使用。本书使用UNIX来指代任何遵循UNIX 原则和API的系统,其中包括苹果的Mac OS X、GNU/Linux的各种发行版(例如,Arch Linux、CentOS、Debian、Fedora、openSUSE、红帽企业版Linux、Slackware和Ubuntu)、UNIX操作系统的各个分支(如AIX、HP-UX、Solaris)、各种BSD衍生(如FreeBSD、OpenBSD、NetBSD),以及在Windows上运行的Cygwin。

与之类似,在编写C 、Java或Python程序时,使用了一种较为现代的语言版本。我在本书中已经尽力规避了那些过于偏颇或过于前沿的例子。

书中所述的“你的代码(your code)”和“你的软件(your software)”指代你所调试的代码和你正在处理的软件。这样说更简便,而且也暗含了所有者的含义,这在开发工作中是非常重要的。

使用routine一词来指代代码调用单元,如成员函数、方法、函数、过程和子程序。

使用Visual Studio和Windows来指代相应的微软产品。

使用版本控制系统(revision control system和version control
system)来指代用于软件配置管理的一些工具,如 Git。

排版与其他惯例

?       代码是用打字机字体(typewriter
font)来书写的,关键点设置为粗体(bold),条款和工具名称用斜体设置(italics)。

?       交互会话清单使用灰度来区分提示、用户输入和产生的输出结果。

$ echo hello, world

Hello world

?       UNIX命令行选项类似–this,或者使用单字符缩写,如-t。与之对应的Windows工具选项则是/this。

?       关键快捷键以Shift-F11键这种形式进行设定。

?       文件路径

抢先评论了 “Effective Debugging英文版:调试软件与系统的66个有效方法” 取消回复

评论

还没有评论。

相关产品

加入购物车

Docker 容器与容器云 第2版

EUR €50.99
阅读更多
缺货

设计模式(重点大学软件工程规划系列教材)

EUR €31.99
加入购物车

软件构架实践(第3版 影印版)

EUR €45.99
阅读更多
缺货

软件工程(21世纪高等学校规划教材 软件工程)

EUR €24.99

东东购的宗旨是服务喜爱阅读中文书籍的海外人民,提供一个完善的购书平台,让国人不论何时何地都能沉浸在书香之中,读着熟悉的中文字,回忆着家乡的味道。


安全加密结账 安心网络购物 支持Paypal付款

常见问题

  • 货物配送
  • 退换货政策
  • 隐私政策
  • 联盟营销

客户服务

  • 联系东东
  • 关于东东
  • 帮我找书
  • 货物追踪
  • 会员登入

订阅最新的优惠讯息和书籍资讯

选择币别

EUR
USD
CAD
AUD
NZD
NOK
GBP
CHF
SEK
CNY
UAH
ILS
SAR
MXN
KRW
MYR
SGD
HUF
TRY
JPY
HKD
TWD
facebookinstagram
©2020 东东购 EasternEast.com

限时特卖:用“SALE15”优惠券全场书籍85折!可与三本88折,六本78折的优惠叠加计算。 忽略