最近整理了我原创的 140 篇编程经验和技术文章,欢迎大家阅读,一起成长!指路:https://t.1yb.co/ARnD

大家好,我是鱼皮。

学编程的过程中,我们会遇到各式各样的 Bug,也常常因为它们而感到头秃。

但随着你不断解决 Bug、积累经验,就会发现其实解决 Bug 也是有套路的。

今天分享下鱼皮自己总结的解决 Bug 套路,帮助大家提高编程学习效率,保护头发。

解决 Bug 套路总结

本文大纲:

准备工作

其实改 Bug 的过程就跟破案是一样的。

首先,在急着去搜索问题、上手写代码改 Bug 之前,先做这么几件事。

1. 获得更多信息

就像案发现场找目击者、搜集证据一样。

我们要搞清楚 Bug 何时发生?为什么会发生?在什么情况下发生?

用户到底做了什么操作,才导致了 Bug ?

是每次都会出现 Bug,还是说点儿背触发了呢,如果是偶然触发,是否可复现呢?

不能复现的 Bug,还叫 Bug 么?

这些信息,都很重要。如果可以的话,最好还能拿到用户详细的报错原因、请求和响应,信息多了,才能帮助我们更精准地定位和分析问题。

2. 明确边界

说白了,就是通过手上已有的信息,搞清楚要把这个 Bug 算在谁的头上?

举个例子,假如说用户突然访问不了你的网站了。这时千万别自己先搁那傻傻分析和排查一通,而是可以先访问下网站试试。要是你能访问的话,说不定根本就不是 Bug,而是用户自家的网线断了!

企业开发中往往是多人协作,比如前端和后端、服务提供者和服务调用者,如何判断是谁写的 Bug 呢?

一般我们可以通过 接口 的请求参数和响应参数来划分职责。

比如我是前端,请求你后端的接口,向你发送 "鱼皮",你必须要返回我 "狗头"。结果最后出现 Bug 时,我一看,我给你发送的是 "鱼皮",你却给我 "鱼头" 了对吧,那显然是你那边的 Bug,雨我无瓜。

3. 保护现场

确定是自己的 Bug 后,如果是线上程序出了 Bug,记得先把当时的程序状态保留下来,比如 dump 内存、下载日志,便于后面排查。

就和破案一样,案发现场的东西千万不能随便乱碰,要不然可能就缺失了关键信息。

接下来看看如何解决 Bug。

自行解决

每个人的时间都很宝贵,出了问题时,建议先不要盲目地去问别人,而是自力更生,可以通过以下方式自己解决。

1. 自查

程序除了问题时,最直接的排查方式就是:对程序的报错、已记录的错误日志进行分析。

比如看到程序报错 "db connection timeout",显然就是数据库连接超时了,这个时候可以先去确认下是不是网络和数据库自身的问题,说不定就已经能解决 Bug 了。

2. 搜索引擎

俗话说得好,遇事不决问某度,这可能是大家最常用的解决 Bug 手段了。

但如今的某度搜索引擎对程序员不太友好,广告多、内容过时、点进去后文不对题,这些都会成为你搜索的障碍。

那大家不妨试试这些技巧:

屏蔽广告

在搜索词后加上 "-advertisement" 可以快速屏蔽搜索的广告信息:

站内搜索

使用 site:域名 + 搜索词,可以在特定的网站内快速搜索,像现在大部分 Bug 的解决方案其实都在 CSDN:

关键词搜索

使用某度搜索长句的时候,可以将错误信息中的关键词拆解出来,比如版本号、数据库类型等,使用空格进行连接叠加关键词,可以更加精准搜索想要的结果,避免连接词的干扰。

限定范围

打开搜索工具,可以给搜索增加限定,比如时间、文件类型等:

当然,其他的搜索引擎也都有自己的搜索技巧,大同小异。

此外,大家也可以试试 开发者搜索 ,专门面向程序员的搜索引擎,纯净很多。而且看起来它的实现方式也很简单,就只从开发者相关网站中搜索内容就行了。

3. 官方文档

当我们使用一些冷门技术或者较新的技术时,国内的搜索引擎可能很难找到解决方案。

这时不妨打开官方文档,直接搜索到和自己问题相关的部分,仔细阅读一遍,说不定就发现其实是自己语法或参数写错了呢?

其实,很多 Bug 就是因为阅读文档不仔细而产生的!

对于组件库、SDK、类库、插件、API 的使用,我其实更倾向于去阅读官方文档,比较直接,一针见血。

4. Github

如果你使用的是开源的项目,那么可以试着在项目仓库的 issues 中搜索答案,尤其是知名项目,用的人很多,你遇到的 Bug 有可能别人也遇到过。

如果有解决方案呢可以直接照搬,哪怕没有解决方案,你也可以试着联系遇到类似 Bug 的同学,共同探索。

5. 追溯源码

除了依赖冲突、内存溢出之类的技术上的 Bug,其实我们工作中更多地是修复业务逻辑上的 Bug。比如做一个支付功能,用户 A 扣了钱,但是没有任何反应。

那么这种情况也别费功夫在网上搜了,因为每个人写的业务代码都不一样,五花八门。不如自己从程序的入口开始,用 Debug 打些断点、打印一些变量信息,一行一行慢慢调试就好了。

如果你怀疑是某个依赖的类或方法出了问题,也可以直接点进去查看它的源码和注释。

寻求帮助

如果自己无法解决问题,我们就只能向他人求助了。

提问技巧

提问也是有技巧的,想要更快、更准确地获得答案,就要把你的问题、场景、前因后果、关键信息都提供清楚,还可以利用 PasteBin 之类的工具分享代码,让别人更好读懂。

像我每天都会收到上百条私信提问,其中很多同学连自己要问什么都描述不清楚,比如:我网站为啥无法访问了?

这种问题我怎么帮你解决呢?这不是耽误彼此的时间么?

所以我建议大家去阅读《提问的智慧》这本免费小书,教你成为一个有智慧的提问者。

地址:https://github.com/tvvocold/How-To-Ask-Questions-The-Smart-Way

途径

想好问什么之后,找谁问呢?

首先是两大平台:国内的 CSDN 相对适合初学者;国外的 Stack Overflow ,更活跃、解答人数会更多。

如果是开源项目,可以考虑在 GitHub 项目仓库下自己提一个新的 Issues ,艾特团队官方人员去解决。

如果你用了别人提供的类库和服务,可以在官方文档中找到项目的维护者,联系他们并反馈。

此外,你也可以加一些专业人员的好友、加些编程交流小队之类的抱团取暖,都是不错的。


最后,如果以上方法都解决不了 Bug,那不妨试一试:重启

重启大法好,Bug 逃不了。重启还不行,那就卸载重装~

以上就是本期分享,我是鱼皮,求个 点赞 ,这将是我持续创作的最大动力,谢谢

这些解决 Bug 的套路,你都会了不?的更多相关文章

  1. Jmeter实现登录bugfree、新建bug、解决bug脚本(抓包工具实现)

    环境 Chrome jmeter3.1 fiddler4 win7 32位 Linux CentOs6.4 bugfree3.0.1 链接:http://pan.baidu.com/s/1gfHpbp ...

  2. 【技术贴】解决bug mantisbt APPLICATION ERROR #1502 没有找到类别

    解决bug mantisAPPLICATION ERROR #1502 没有找到类别 mantisbt出现1502问题解决:引起问题的原因:当提交的问题有分类,此时删除此分类,就会出现下面的情况.问题 ...

  3. 解决bug感觉

    解决bug,没有思路,很烦躁: 时间过去好久,还是没头绪,没结论: ...... ...... ...... ...... ...... 过了好久,这样还不如冷静下来,按照正确的方法(review代码 ...

  4. Jmeter实现登录、创建BUG、解决bug的手写脚本

    一.登录 1.          打开jmeter.添加线程组,命名为test,如下图: 2.          添加HTTp默认请求 1)服务器名称或IP:这里只能填写域名或IP地址 2)端口号:配 ...

  5. m_Orchestrate learning system---十、解决bug最根本的操作是什么

    m_Orchestrate learning system---十.解决bug最根本的操作是什么 一.总结 一句话总结:多学多练,遇到bug超级轻松 1.如何查看js代码的异常? 开发者选项里面可以查 ...

  6. ios捕获异常并发送图片,便于解决bug

    在开发过程中,我们有时候会留下Bug,用户在使用我们的app 的时候,有时会出现闪退,这时候我们能够让用户给我们发送邮件,以让我们开发者更加高速的地位到Bug的所在.以最快的时间解决.同一时候也提高用 ...

  7. iOS 之 调试、解决BUG

    iOS 解决一个复杂bug 之 计分卡 iOS 调试 之 打印 iOS 错误之 NSObject .CGFloat iOS bug 之 H5 页面没有弹出提示框 iOS 日志工具 CocoaLumbe ...

  8. 【我的Android进阶之旅】解决bug:You need to use a Theme.AppCompat theme (or descendant) with this activity.

    前言 今天用Android Studio 生成Activity的时候,默认继承AppCompatActivity ,而在AndroidManifest.xml我对该Activity设置了一个主题,然后 ...

  9. 1,全局变量;2,图形验证码;3,解决bug的毅力

    通过这一整天的学习,主要解决了这三个: 1,全局变量 在函数外部定义: var gloabl: function test(){ global = " ":    //不能写成va ...

  10. 解决BUG:CS1617: 选项“6”对 /langversion 无效;必须是 ISO-1、ISO-2、3、4、5 或 Default

    vs 2015的项目用vs2013,更改.net版本之后,打开会报以下错误,原因是配置文件修改出了问题.已经验证是BUG 你只需要把Web.config换成以前的就好了.   https://conn ...

随机推荐

  1. Java的SPI机制与简单的示例

    一.SPI机制 这里先说下SPI的一个概念,SPI英文为Service Provider Interface单从字面可以理解为Service提供者接口,正如从SPI的名字去理解SPI就是Service ...

  2. [QTP/UFT12]无限延长试用期的方法

    1. 删除C:\ProgramData隐藏目录下的SafeNet Sentinel文件夹 2.运行QTP安装目录下的bin\instdemo.exe 3. 重新运行QTP/UFT 12后即可恢复30天 ...

  3. 在页面上以消息束的形式同时抛出多个DialogMessage

    com.sun.java.util.collections.ArrayList exceptions = new com.sun.java.util.collections.ArrayList(); ...

  4. Linux 动态链接库学习笔记

    参考资料: http://www.linuxidc.com/Linux/2012-01/50739.htm http://www.yolinux.com/TUTORIALS/LibraryArchiv ...

  5. AE+C# 向axPageLayoutControl1添加图例

    原文 AE+C# 向axPageLayoutControl1添加图例 //Get the GraphicsContainer IGraphicsContainer graphicsContainer ...

  6. HTML+CSS3 纯代码实现转盘效果

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  7. Touch事件or手机卫士面试题整理回答(二)

    Touch事件or手机卫士面试题整理回答(二) 自定义控件 1. Touch事件的传递机制 顶级View->父View->子View,不处理逆向返回 OnInterceptTouchEve ...

  8. VC皮肤库之duilib

    首先是个国产的开源 的,directui 界面库,开放,共享,惠众,共赢,遵循bsd协议,可以免费用于商业项目,目前支持Windows 32 .Window CE.Mobile等平台. Duilib ...

  9. JVM内存模型及垃圾收集策略解析

    一 JVM内存模型 1.1 Java栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程.它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文 ...

  10. _declspec(dllexport)与_declspec(dllimport)

    __declspec(dllexport)2009-03-04 17:25 我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文 ...