软件崩溃了,该如何解决?
解决问题讲究的是对症下药。软件崩溃,也同样如此。我们需要找到崩溃的原因。对于软件崩溃,我们如何去定位问题,这就是你今天问的问题。
中医的望闻问切,是很有用的。对于软件的问题的调查和分析,同样也可以望闻问切。
一、望
望,就是观察现象。所谓观察现象,就是观其的运行的情况。软件是如何运行起来的,又是如何崩溃的,崩溃的提示是什么。这些是很表面的崩溃现象,可以很直观的看到。这个层面,我们只需要观察到基本的运行的现象,搜集相关的描述。当然,也不是简单看着崩溃一次就完事的。我们至少要了解这些情况:操作系统、运行权限、软件的操作流程、崩溃的错误提示,崩溃的现象等。这些情况看似很简单,但是却给定位错误提供了最基础的根据。
除了很有经验的人,或者对自己的软件了如指掌的人,通过望就可能知道问题所在。因为软件之前会出现这些问题,所以就可以直接找到问题所在。而对于一般的水平的人,或者软件确实很复杂,那么就很难做到一看就知病因的地步。这个也很正常。这一步就是搜集基本的直观的错误信息,这样就可以了。
这一步也不能完全是看一遍就了事的。最终有没有解决,还是要通过这一步来观察,至少要从表面上消除症状。如果所有症状都和找到的问题一一对应,解释的合情合理,解决后症状就消失了,还原症状又出来了,这样就确定是真的找到问题,至少在症状上是真的找到问题了。
另外,很多时候,不是一遍就行,还需要反反复复的让软件死来死去,从这个过程中观察规律。这也是搜集现象的一种手段。单次的运行只有一次现象,当大量的现象汇聚就形成了一个规律性现象,此时可能更能表现出问题。举个例子,一个产生随机数的程序,一次两次可能只是觉得随机数始终不大于10,你以为这是正常的。但是通过大量的试验,结果一直都不大于10,而你当初设定的范围是0-100,如此来看,就很可能有问题。然后再通过这个现象分析出来,根据统计学的概率论,一直小于10肯定不正常。如果你只是测试几次,这个问题是很难查出来的。这就是规律性问题。
二、闻
闻,就是听声息。所谓听声息,就是因为直接看是看不出来的。所以需要进一步的去找症状。注意,这里还是在找症状。只不过是找的更加深入一点。声息不是表面的气色,是看不见的。在软件上,我们对应到内存、CPU、磁盘等的操作情况。很多复杂的问题,往往不是表面现象能看得出来的。此时我们需要听其声息。毫不夸张的说,我们甚至有时候会去听声音哦,比如听硬盘转动的声音,听风扇的声音等等。硬盘转速的变化,可能是由于程序异常的读写导致转速不规律,或者陷入死循环的读写磁盘,都会导致硬盘疯狂旋转。当然,这里说的是机械硬盘。如果是固态呢,我们可以感受温度。而风扇的疯狂则有可能是陷入死循环,导致CPU长期执行高运算量的计算而发热很大,风扇自然转速加快以散热。
举这些例子并不是说让你去这么做,当然有时候确实需要这样做。特别是做硬件开发,那太常见了。比如要闻一下电路板是否烧焦了。更多时候,软件问题很少会涉及到以上的那些操作。
我们这里说的闻,更多指的是深入一层次的观察现象。因为表面的现象已经无法分析出问题。我们一般会从内存的事情情况、CPU的使用情况、硬盘的读写方面着手观察。通过CPU的使用率,可能分析出死循环、死递归等。而硬盘读写可以分析出文件的读写卡死问题。内存的问题则有很多的内存占用,以至于导致系统内存陷入无可用内存状态,最后甚至导致整个系统挂掉,这个我曾经就遇到并解决过。
那么具体如何看,最简单的工具就是,任务管理器。当然还有很多逼格很高的工具,可以分析进程线程、动态库、锁等更高级的东西。比如有的工具可能分析的出来死锁问题而导致的软件被系统杀死。那么分析的深度如何,就看个人的知识水平如何了。如果你连进程是什么都不知道,就不要想着能够操作这些高级的工具了。而这些分析的过程,还是需要自己去多实践多总结。没有一个治百病的经验,只有实践才是最好的工具。
三、问
问,就是询问症状。如果你的软件给用户使用,可能你前面两步搜集到的信息确实有限,即使用户录屏了,依然还是满足不了的话,那么你就需要去询问情况了。
询问是很有必要的。同时也要注意一个地方,那就是先从最白痴最基础的地方问起。比如用户没有网,然后启动你的程序,你的程序没有考虑这个问题,然后就直接认为是有网,然后挂了,抛了网络异常。而你对此是没有预先考虑到的,所以出错了。如果你先不问用户电脑联网情况,就是问一大堆,可能都找不到问题所在。这也可能是因为你本身对于联网这个事情也不清楚导致的。
询问用户是弥补你不能直接搜集问题现象。当然了,询问用户不是我们这里要说的重点。我们询问的应该是计算机。你是不是觉得询问计算机是非常神奇的事情。计算机又不能说话。这就是人机交流,而且是程序员必备的技能哦。
所谓询问计算机,其实就是要主动去与计算机交流,看看计算机能够给你提供多少信息。只要你足够厉害,你问什么计算机都会给你什么信息。说的直白点,也就是做条件测试。这是一种主动性的现象观察。通过对不同情况的模拟测试,获得对应的信息,然后再反过来分析现象。这个在望的基础上走的更远。往往很多软件的问题的定位都是通过问计算机得以解决的。
用到的手段如:控制台命令测试、系统设置的切换、切换不同的操作系统运行、使用不同的权限运行、模拟不同的操作方式、使用不同的用户张号等等。方法很多,不一而足。更多是结合自己软件的特性来做针对性的测试观察。
四、切
切,就是把脉。通过以上的深度调查,必然能够搜集到大量的信息,如果还不能确诊,那么就要继续深入。最后一道就是把脉。把脉的是代码。我们通过现象,定位代码的大致范围,然后仔细分析代码的流程,然后进行大量的测试,去对照现象进行分析,或者临时修改代码进行测试性运行,慢慢缩小问题的范围,最后定位问题。
代码是程序的脉,代码是程序的灵魂。在代码中调试错误的工具和方法,相信各个IDE提供了强有力的工具。我就不说了。我们要用好手中的每一个调试工具,让自己更多了解程序的运行情况。
那么最后说一下如何提高解决效率。
1.搜集充足的现象
没有足够的现象,是很难定位问题的,问题越精确,也就能越快定位问题。问题现象了解的越多,就越能准确定位问题所在地。如果现象太少,目标就太泛,这样解决效率自然很低。如何搜集问题,在前面已经详细讲述了。
2.保持足够冷静的思维
思维的冷静是非常重要的。遇到的问题越紧急,越需要冷静的思维。思维的冷静不代表你不着急,只有冷静的思维,才能在众多的现象中找到蛛丝马迹。
3.发散思维,打破思维僵局
思维僵局,往往是找问题最大的天敌。如果在一个问题上,始终都不得其解,记住,要及时退出这样的状态。你可以先放下问题,走两步,或喝喝茶。换一个方向思考分析问题,往往是非常有用的。
4.细心分析现象和代码流程
在大量错误涌来的时候,细心很重要。我们要细心对待每一个问题,然后再认真的分析代码的流程。很多问题可能是并发症,解决了源头问题就可以解决所有问题。只有通过各种下问题,逐步追根溯源,慢慢找到最源头,然后从源头上解决。
那么这四点,加上前面的搜集和调查问题的方法,应该是非常高效的解决办法了。看似简单,却不简单。而每一步都需要大量的实践,在长期的实践中积累到足够的经验和技巧,才能快速的解决各种疑难杂症,没有捷径可走。
领取专属 10元无门槛券
私享最新 技术干货