在上次讲调试的小课堂里我曾经提到过我前一阵子遇到过一个 Matlab 的问题,具体症状是,开启 Matlab 来做计算,过了大约一天以后,再去看,就会发现系统处于完全无响应的状态,完全挂掉了,键盘有一个灯在闪烁。
碰到了好几次之后我相当崩溃,这个 bug 几乎处于不可调试的状态,首先要重现 bug 就很麻烦,虽然几乎都能重新,但是我不可能一直坐在那里盯着屏幕等一天(具体需要几个小时来重现我也不太清除),而且 bug 出现之后系统会挂掉,唯一的办法是强制重启,这个时候所有现场都被销毁了。另一方面,阅读代码的必杀技也没法用,因为我的程序是一段不长的 Matlab 代码,在这样的脚本语言里,内存都是自动管理的,我能想到的危害最大的操作大概就是申请超大内存了,一般会有两个结局:如果 swap 空间还能承受得了的话,会使用 swap 空间,并导致系统奇慢无比,不过并没有挂掉;如果 swap 空间都不够用了,那么 Linux 系统会把这个进程 kill 掉,而不是同归于尽。总的来说,不太可能是这段 Matlab 脚本导致了这么严重的问题,如果真有问题的话,估计是出在 Matlab 了,并且还是非常强悍的 bug ,会让系统彻底挂掉。
最近我终于发现了问题的原因(应该是这个原因吧),之所以发现应该是完全处于运气好,或者说之所以一直没有发现真正原因也是由于运气不好吧。事实证明,我在小册子里列的 7 Golden Rules of Debugging 里的第四条“检查电源是否插好”确实也是非常重要的。因为这里的问题就在于这样的和代码本身并无关系的外部原因——在大多数情况下都不会出现的异常外部情况(比如电源没有插上)。
我这里的问题是 CPU 风扇挂掉了。所以计算量过大的时候 CPU 过热,导致系统挂掉了。我之所以发现是因为那天我碰巧目睹了这个 bug 发生,于是我重启了电脑,结果屏幕上不断闪现 CPU 过热的错误信息,我打开机箱一看,才发现风扇不转了。而以前之所以没有发现,是因为我都是把程序启动起来,过了很久过来看,系统挂掉了,这个时候通常是已经挂掉很久了,CPU 也已经冷却了,再重启的时候就没有出现错误了。 :-/
解决问题的办法嘛,把灰尘清理了一下,然后暴力把风扇脖子使劲拧了几下,它终于吭哧吭哧地开始转了,不过看起来总是很吃力的样子,虽然冬天到了,不过估计还是应该抽空换一个了。
其实这个问题我应该很早就发现才对!因为最近一段时间感觉那个电脑的发热量变得很大,坐在旁边感觉比以前热很多,但是似乎这样一个信息被我自动无视了。看来,真的是要对生活中出现的异常情况保持敏锐的嗅觉才行啊,不能太迟钝了。 😀
哈哈,这个好玩
你也许需要一只犬夜叉来及时发现问题 o.o
that is why you need a server with ILOM and FMA on Solaris
@quark
求一只……
@Rocky
唔,好吧,看起来对于大型的或者重要的机房来说,这些问题如果能自动化地解决确实是很有必要的呀!
其实靠谱一点的PC主板也可以设置风扇异常报警,靠谱一点的PC操作系统也有办法。Windows下面最好安装主板厂家的工具,Unix下也有类似hwmon的各种机制。
你的电脑也太强了吧,风扇不转居然还能运行。
我遇到了同样的问题,但我用的是Ubuntu,直接查看内核信息,精确定位,哈哈