`

程序员如何在复杂代码中查找到程序的bug?

 
阅读更多

1. 优先解决那些可重现的,可重现的bug特别好找,反复调试测试就好了,先把好解决的干掉,这样最节约时间。

2. 对于某些bug没有头绪或者现象古怪不知道从哪里下手,找有经验的同事问一下思路,因为在那种开发多年的大型系统里,经常会反复出现同样原因的bug,原因都类似,改了一处,过一阵子另外一处又冒出来,而且无法根治。
比如:我那个系统里有个特别危险的API,接口参数比较难用,一旦有人用错了某些情况下就会出诡异的现象,解决很简单,找到调用这个API的地方把调用方式写对就好了。为什么不根治呢?因为要保持兼容性不能改接口了。Windows系统里就好多这种烂API。
问下老员工吧,说不定他们都遇到过好多次了。

3. 放大现象,有些bug现象不太明显,那么就想办法增大它的破坏性,把现象放大。这只是个思路,具体怎么放大只能根据具体的代码来定。

4. 二分法定位,把程序逻辑一点点注释掉,看看还会不会出问题,类似二分查找的方法,逐步缩小问题范围。

5. 模拟现场,有时候我会问自己,如果我要实现bug描述的现象我要怎么写代码才行?
比如:我遇到一个死锁问题,但是检查代码发现所有的锁都是配对的,没有忘记解锁的地方,而且锁很简单就是一个普通的临界段,保护几行赋值语句而已。这样的代码怎么写才能让他死锁呢?
我想如果让我故意制造这样一个现象,只有在上锁的时候强制杀掉线程了。
既然这样就可以去看看有谁强杀线程了没有。

6. 制作工具,针对某些bug编写一些调试辅助工具。
比如,我那个系统没有完善的崩溃报告,虽然也有dump,但是分析出来的callstack经常不准。于是我为解决崩溃问题编写了个工具,会自动扫描代码,在每个函数入口和出口插入log,以此来定位崩溃点。

7. 掩盖问题,虽然这样做有点不厚道,但是有时不得不这么做。有些bug找不到真正的root cause,但是又要在规定时间内解决,那么我们就可以治疗症状而不去找病因。比如用try catch掩盖一些奇怪的崩溃。不到万不得已不要这么干,未来可能会付出更大代价。

分享到:
评论

相关推荐

    程序员级高级程序员级程序设计

    在本课程中,你会学习到排序、查找算法,如快速排序、归并排序、二分查找等,以及链表、树、图等经典数据结构的实现和应用。 其次,并发编程是现代多核处理器环境下必备的技能。通过理解和掌握线程、进程、锁、信号...

    图灵程序设计丛书-代码之外的功夫:程序员精进之路

    《代码之外的功夫:程序员精进之路》是图灵程序设计丛书中的一部,它强调了程序员不仅仅是个技术工匠,更是问题解决者和社会创新者。这本书深入探讨了那些超越编程技术本身,对于提升程序员能力至关重要的方面。以下...

    全球首位AI程序员是否会抢走程序员饭碗.docx

    Devin不仅掌握了全栈技能,还能自学新技术、构建和部署应用程序、自主查找并修复Bug、训练和微调自己的AI模型等。这一事件引发了广泛的讨论:AI程序员是否将取代人类程序员?本文将从多个角度深入探讨这一话题。 ##...

    高级程序员必备条件

    高级程序员应该熟练掌握多种设计模式,并能够在实际项目中灵活运用,以提高代码的可读性和可维护性。 #### 5. 熟悉Socket编程 Socket编程是实现网络通信的基础技术之一。熟悉Socket编程可以帮助开发者更好地处理...

    我一个程序员的离奇经历

    6. **时间旅行的编程悖论**:在某些科幻情节中,程序员可能写了一个能够预测未来的程序,或者创建了一个可以修改过去的数据结构,这将引发一系列复杂的时间逻辑问题。 7. **分布式系统的困境**:在构建分布式系统时...

    vscode代码追踪插件

    在编程领域,代码追踪是一项至关重要的功能,它允许开发者理解代码的执行流程,查找错误并优化程序。VSCode(Visual Studio Code)是一款由微软开发的免费、跨平台的源代码编辑器,受到了全球开发者的广泛欢迎。它...

    查找关键字软件(search and replace)

    在IT领域,搜索和替换...无论是程序员在代码中查找bug,还是内容创作者在大量文本中统一风格,这款软件都能提供极大的便利。通过熟练掌握这些功能,可以极大地提高处理文本任务的效率,减少人工劳动,提升工作质量。

    java代码规范

    大多数情况下,并非程序中有复杂的算法或是复杂的逻辑,而是去读别人的代码实在是一件痛苦的事情。统一的风格使得代码可读性大大提高了,人们看到任何一段代码都会觉得异常熟悉。显然的,规范的代码在团队的合作开发...

    用GDB调试程序

    这对于查找和修复bug来说非常有用,因为你可以观察到程序在关键点上的状态。 例如,在提供的示例中,`tst.c`程序包含一个计算前n个整数之和的函数`func`和一个计算1到100的整数之和的主程序。通过`cc -g`编译选项,...

    程序员英语手册

    - **应用场景**:在企业级软件开发中,为了实现不同应用程序间的数据共享与流程自动化。 **2. Abstract 抽象的** - **定义**:在编程中指非具体存在的概念,如抽象类、抽象方法等,用于提供一个通用的模板或骨架,...

    如何成为一个合格的C++程序员

    3. **调试技巧**:掌握IDE提供的调试工具,包括设置断点、单步执行、查看变量值等功能,这对于查找和修复bug至关重要。 #### 三、API的掌握 1. **窗口API**:掌握80%以上的Windows API关于窗口控制和管理的部分,...

    android程序员宝典应用

    3. **bug管理和标志位**:在程序中,bug是不可避免的。良好的bug管理包括记录、追踪、修复和测试。添加标志位是一种常见的错误处理策略,它可以帮助开发者在运行时识别特定功能的状态,例如,当某个答案可用时,设置...

    老程序员才知道的技巧

    在编程过程中,隔离是减少依赖的关键,好的命名可以提高代码的可读性,而测试则是确保软件质量的基础。 #### 13. 代码规模控制 单个代码片段或函数的规模不宜过大,否则会影响代码的可读性和可维护性。合理地划分...

    高质量程序设计指南(2版)

    书中可能详细介绍了错误处理方法,如使用异常处理机制,以及如何利用调试工具来查找和修复程序中的bug。此外,代码优化和性能调优也是提高程序效率的重要手段,林锐可能会分享一些实战经验,帮助读者编写出更高效的...

    PIC 单片机 反汇编程序

    反汇编程序就起到了桥梁的作用,使得开发人员能够在高级抽象层面上理解和修改底层代码。 **总结** PIC单片机的反汇编程序如DisASM,是嵌入式开发中的重要工具,它帮助开发者理解二进制代码,进行故障排查和优化...

    C++程序包,安心下载,本人也在用费力收集

    静态库在编译时会被链接到目标程序中,形成一个独立的可执行文件;动态库则在运行时被加载,可以减少程序的大小并实现多个程序共享同一库。"hackol.com-qlqqsq-v3.2"可能就是这样的一个库,用于提供特定的功能或服务...

    VBA代码编辑管理器.zip

    VBA(Visual Basic for Applications)是一种在Microsoft Office应用程序中使用的编程语言,允许用户自定义工作流程,自动化任务,创建宏,以及开发复杂的解决方案。VBA代码编辑管理器是专为优化VBA编程环境而设计的...

    Understand代码阅读带注册码

    3. 变量与函数使用分析:Understand可以追踪变量和函数的使用情况,提供使用频率、引用路径等信息,便于优化代码和查找bug。 4. 代码复杂度计算:它能计算出代码的Cyclomatic复杂度,帮助开发者识别和改进难以理解...

    cpp-check 代码审查小工具

    **正文** cpp-check是一款强大的静态代码分析工具,主要用于C++编程语言。它的主要目标是帮助开发者在编译之前发现潜在的...通过集成到日常开发工作流,开发者可以持续优化代码,减少bug,提高软件的稳定性和可靠性。

Global site tag (gtag.js) - Google Analytics