有人的pc持續工作49天後,就停止工作了(當機,沒反應)。這個題目在2004年好像很熱門,google一下就可以知道,有些甚至牽拖到LA機場管制49天當機的事件上。(據說當時機器是使用Windows)。
回答:
這是Vtdapi.vxd 造成的,換掉這個VXD就可以了。
真有趣,為甚麼是49天呢?
因為Windows有一個system api :DWORD GetTickCount(void)會傳回從開機開始,每1 ms +1的 tick count, DWORD 的最大值是..
4,294,967.296 s = 71582.78827 min = 1193.046471 hr = 49.7103 days
所以....過了49天後,這個值就歸0了... 這就是當機的原因 @_@
GetTickCount( ) 是一個popular 的function (?),尤其是在embedded system上,目前在CE上還是有這個function 可以用,也有同樣的問題: 49 天overflow。
所以CE blog有特別說出這個function 的使用方法: 用來計算差值,不要拿絕對值來使用。
也就是說,像以下這樣,用vu:
DWORD starttime = GetTickCount();就不會有roll over問題,
.....
.....
if( GetTickCount( ) - starttime >100)
dosomething...
因為 unsigned :
0 - 0xFFFFFFFF = 1所以,只要不要超過49x2天(約),計算上就不會有問題。
CE 系統為了讓"粗心"的programmer 及早發現這個問題,
將GetTickCount( )的初始值設在2 min 後overflow。
所以 如果你的機器 發生 "謎樣的2 min 死亡" 事件,就該查察 是否有哪裡 用了 GetTickCount( )這個function 了。
但是... 10 sec 當機的原因是什麼?
沒有留言:
張貼留言