登入帳戶  | 訂單查詢  | 購物車/收銀台( 0 ) | 在線留言板  | 付款方式  | 聯絡我們  | 運費計算  | 幫助中心 |  加入書簽
會員登入 新註冊 | 新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類閱讀雜誌 香港/國際用戶
最新/最熱/最齊全的簡體書網 品種:超過100萬種書,正品正价,放心網購,悭钱省心 送貨:速遞 / EMS,時效:出貨後2-3日

2024年03月出版新書

2024年02月出版新書

2024年01月出版新書

2023年12月出版新書

2023年11月出版新書

2023年10月出版新書

2023年09月出版新書

2023年08月出版新書

2023年07月出版新書

2023年06月出版新書

2023年05月出版新書

2023年04月出版新書

2023年03月出版新書

2023年02月出版新書

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

書城自編碼: 3021109
分類: 簡體書→大陸圖書→計算機/網絡软件工程/开发项目管理
作者: [希腊]Diomidis Spinellis[季奥米季斯·斯
國際書號(ISBN): 9787121315312
出版社: 电子工业出版社
出版日期: 2017-06-01
版次: 1 印次: 1
頁數/字數: 252/
書度/開本: 16开 釘裝: 平塑

售價:NT$ 540

我要買

share:

** 我創建的書架 **
未登入.



新書推薦:
抗焦虑饮食(赠实践手册)
《 抗焦虑饮食(赠实践手册) 》

售價:NT$ 498.0
生活不是掷骰子:理性决策的贝叶斯思维
《 生活不是掷骰子:理性决策的贝叶斯思维 》

售價:NT$ 386.0
万有引力书系·基辅罗斯:东斯拉夫文明的起源
《 万有引力书系·基辅罗斯:东斯拉夫文明的起源 》

售價:NT$ 661.0
康熙的红票:全球化中的清朝
《 康熙的红票:全球化中的清朝 》

售價:NT$ 437.0
PyTorch语音识别实战
《 PyTorch语音识别实战 》

售價:NT$ 386.0
多卖三倍
《 多卖三倍 》

售價:NT$ 252.0
哲学思维:清晰思考的12条关键原则
《 哲学思维:清晰思考的12条关键原则 》

售價:NT$ 386.0
海盗之书
《 海盗之书 》

售價:NT$ 381.0

建議一齊購買:

+

NT$ 641
《 Effective SQL:编写高质量SQL语句的61条有效方法(英文版) 》
+

NT$ 468
《 The Little Schemer:递归与函数式的奥妙 》
+

NT$ 569
《 ARM嵌入式系统编程与优化(英文版) 》
+

NT$ 778
《 现代C++探秘:编码、工程与科研必修(基于C++ 14)(英文版) 》
+

NT$ 850
《 流利的Python语言(影印版) 》
編輯推薦:
《代码阅读》《代码质量》作者、IEEE Software主编Diomidis Spinelli再出力作。
经典原味,解决多种软件故障。
全面看待程序错误,加快调试进程。
內容簡介:
本书作者着眼于一系列可能会在现代软件系统中出现的问题,特别是分散在地球上的组件和服务之间复杂的相互影响造成的问题。无论您是否正在调试独立运行的错误或灾难性的企业系统故障,本指南将帮助您更快更少痛苦地完成任务。
關於作者:
Diomidis Spinellis,雅典经济与商业大学科技管理学院教授,针对复杂系统开发和调试进行了深入的研究。他的履历包括,谷歌网站可靠性工程部门任职高级程序工程师,FreeBSD团队,为OS X和BSD Unix提供代码,开发了诸如UMLGraph和CScout等广泛使用的开源软件。他的著作Code Reading (Addison-Wesley,2003年)和Code Quality (Addison-Wesley,2006年)双双荣获软件开发生产力大奖。他还是ACM以及IEEE的高级会员。
影印版,无译者………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
目錄
目录
前言 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 Failures 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 Codes Readability and Structure 126
Item 49: Fix the Bugs 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 Codes 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、GNULinux的各种发行版(例如,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键这种形式进行设定。
? 文件路径

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 香港用户  | 台灣用户 | 海外用户
megBook.com.tw
Copyright (C) 2013 - 2024 (香港)大書城有限公司 All Rights Reserved.