热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

软件调试修炼之道之——特殊案例

特殊案例之一就是修补已经发布的软件,诊断这种缺陷与其他缺陷并没有什么不同,但修复的目标通常是要修复错误的根源,而对已经发布的软件要进行修补时,他只是在最大程度降低风险。如果缺陷出现在用户已经使用的

特殊案例之一就是修补已经发布的软件,诊断这种缺陷与其他缺陷并没有什么不同,但修复的目标通常是要修复错误的根源,而对已经发布的软件要进行修补时,他只是在最大程度降低风险。

如果缺陷出现在用户已经使用的软件中,那么需要考虑向后兼容的问题。首先需要确定正在进行的修复是否可能引起兼容问题,此时,我们能做的就是对整体了解的基础上思考,将确定兼容性问题加入到缺陷修复的检查列表中,一旦确定有兼容性问题,该如何解决呢

1. 提供迁移的方法:给用户提供一些方法来修改其现有数据,代码等东西,以适应新的规则。

2. 实现一个兼容模式:比如office word 2010打开word 2003版本显示如下:

这不是一个能被轻易采用的方法,因为它的成本非常高。从用户的角度来看,兼容模式让人困惑,他们必须知道软件支持两种不同的行为,它们的不同之处是什么,什么时候用哪种模式,只有付出的成本合理时才会用这种模式。

3. 提供预警:只有当你能长时间延长修复以使你的用户能够迁移,并且知道用户是否真的迁移的情况下才有效。

4. 不修复缺陷:当然,这不是一个好的解决方案,只是,极少数情况下,它是一个务实的选择。

并发软件是难以重现、难以诊断以及难以修复的主要问题来源。这些软件的缺陷具有很大的不确定性,它们之间存在微妙并且难以理解的相互作用,并且受很多不明原因的失效模式影响。

可以在并发软件中添加很多东西帮你调试,两个关键的要素就是简单和控制

简单是任何软件设计的关键要素之一,但是它在处理并发问题时尤其重要。保持独立线程的直接相互作用,尽可能将它们限制在一些小的代码区内等。

一个简单的设计不仅可以使你的软件更容易理解,并且从一开始就会减少缺陷的产生,而且更容易控制。

当你要修复并发软件中产生的缺陷的时候,要记住一个关键的要素——让它们尽可能少发生不是可取的修复办法

修复并发缺陷时,要避免使用sleep()方法,虽然它在强迫缺陷可靠重现的时候是一种极其有用的手段。

海森堡缺陷,一个当你开始寻找的时候就会“消失”的缺陷,也被称为观察者效应。

海森堡缺陷依赖于软件的某些不确定因素,这本身可以成为一个有用的线索。之前我们说过,导致不确定性因素的原因是非常有限的,所以意味着这个缺陷一定会被这些原因中的一个所影响。你应该进行的最快最容易的尝试是从一个收集信息的方法转换到另一个方法,如果不行,则要找到某种方法来收集你所需要的信息,这种方法对软件的影响极小,保证不会改变它的行为,而日志记录是改变时序的一个主要原因。你可以利用对不确定性区域的理解,来避免影响这些区域。

如何确定海森堡缺陷被修复了呢?唯一的办法就是要比平时更仔细,确保你真正的了解潜藏的根本原因。

性能缺陷:如同任何种类的缺陷,解决性能问题的关键是确定问题产生的根本原因。十之八九,这意味着你将去寻找瓶颈——代码的某个特定区限制了整体性能,按照从运行的软件中收集的数据运行,这是唯一确定的解决方法。因此,主要关注点是保证生成的性能分析文档能够准确反映软件的真实行为。

准确的性能分析:你要分析的构建应该尽可能接近产品版本,运行的环境要尽可能与软件的最终目标运行环境相同,使用具有代表性的数据运行软件。

如果没有瓶颈呢?如果没有性能瓶颈,但是软件运行很慢,那么主要的原因可能有:资源耗尽(是否存在内存或资源泄露)、垃圾收集(软件是否分配很多短生命周期的对象让GC频繁运行)、缓存(遇到大量缓存丢失?)。

嵌入式软件:调试嵌入式软件的棘手并不在于它的错综复杂,而是因为它的运行环境,此时,你需要一些调试工具帮助你。

第三方软件缺陷:第三方的代码只是代码,而且,如同任何代码,它也包含缺陷,所以,很可能你要追踪的问题不是你自己造成的。但是,不要轻易埋怨别人。带着怀疑的眼光对待自己的代码,首先假设你的代码是有缺陷的。当你用尽了方法证明自己的代码正确,再去埋怨三方的代码。如何处理三方代码中的缺陷呢?提交报告等待三方负责人修复缺陷,当然,你可以尝试找到问题的解决方法,并在缺陷报告上详细说明,可能的话,与三方负责人进行沟通,而最好的解决办法通常是在短期内搁置问题。

一种非常重要的第三方代码是开源代码:只要给予足够的关注,所有的缺陷都是浅显的,但是开源并不意味着传统调试的结束。开源的本质意味着你不能以中心化的方式构建软件。开源社区可以提供很大的帮助,在这里,可以得到完全免费的高质量软件,而高质量的技术支持也是免费的,但是,有效的寻求帮助是一门艺术

首先,做你应该做的,检查文档,经常提出问题,搜索邮件列表和博客条目,看看是否其他人也遇到过同样的问题。

尽可能多的给出信息。

记住:帮助你的人是自愿的。

如果你修复了缺陷,之后可将修复程序提交回中央进行处理。


推荐阅读
  • 深度解析:用友云Pontus限流服务提升系统稳定性
    本文深入探讨了用友云Pontus限流服务的技术细节及其在提高系统稳定性方面的作用,特别是在面对突发流量时的保护机制。 ... [详细]
  • 本文概述了在GNU/Linux系统中,动态库在链接和运行阶段的搜索路径及其指定方法,包括通过编译时参数、环境变量及系统配置文件等方式来控制动态库的查找路径。 ... [详细]
  • 本文深入探讨了MySQL中的高级特性,包括索引机制、锁的使用及管理、以及如何利用慢查询日志优化性能。适合有一定MySQL基础的读者进一步提升技能。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • Hibernate全自动全映射ORM框架,旨在消除sql,是一个持久层的ORM框架1)、基础概念DAO(DataAccessorOb ... [详细]
  • 本文深入探讨了Linux内核中进程地址空间的设计与实现,包括虚拟地址空间的概念、内存描述符`mm_struct`的作用、内核线程与用户进程的区别、进程地址空间的分配方法、虚拟内存区域(VMA)的结构以及地址空间与页表之间的映射机制。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • TCP协议中的可靠传输机制分析
    本文深入探讨了TCP协议如何通过滑动窗口和超时重传来确保数据传输的可靠性,同时介绍了流量控制和拥塞控制的基本原理及其在实际网络通信中的应用。 ... [详细]
  • 本文详细介绍了如何利用 Bootstrap Table 实现数据展示与操作,包括数据加载、表格配置及前后端交互等关键步骤。 ... [详细]
  • 本文详细介绍了笔记本电脑上多种实用的快捷键,包括屏幕调整、图形设置、分辨率更改、驱动更新、导航操作、音量控制及屏幕锁定等,旨在帮助用户更高效地使用笔记本电脑。 ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • 本文详细介绍了在Windows系统中如何配置Nginx以实现高效的缓存加速功能,包括关键的配置文件设置和示例代码。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
author-avatar
木目心磊_559
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有