PC 當機的原因

前幾天,我那堪稱身強體壯的電腦居然當機了!這個問題源自於那天陪女兒去光南買文具時,意外看到 NBA2K14 的海報,它才賣 880 NTD 耶…, 一時衝動我就“支持原版“了。(不想支持原版的,請找大陸同胞就對了。)誰知這個遊戲讓我一跑就當機,從此開啟了我為期兩週的修電腦夢魘。

新遊戲導致當機當然先懷疑軟體,上網 Google 了一下,確實有類似的災情。這些網站上的好心人, 除了教人檢查CPU、顯示卡、記憶體、電源供應器等硬體之外,聽起來最合理的解法, 就是更新顯示卡的驅動程式和安裝 visual C run time library.

雖然這些試過了都沒有效果,但是過程中還是學到很多東西。例如 Everest 現在可以測試 PC 效能, 有些人跟我一樣, 跑到 sinJulia, 畫面就不會動或是當機了. 也有人同樣是跑 Windows 體驗分數時出問題, 大約在跑 Direct 9 測試的時候當掉! (有人說先把 WinSAT 目錄清掉再跑, 但這對我也沒用.) 另外就是我跑 3D Mark 必當, 只是時間早晚而已! 有人和我一樣, 也有人跑一個禮拜沒事!

經過觀察, 我發現只要跑 WinSAT 或是 3D Mark 時, 電腦的風扇聲就會變大. 我想, 或許電腦在偷偷超頻吧? 或許這就是原因? 於是我到 BIOS 那邊去做各種設定, 此時我才知道華碩的 P8Z68 還真是愛偷跑, 光是在 BIOS 簡易設定裡把效能降到最低並沒有用, 每次重新開機必定至少偷跑個十幾 MHz. 即使把 Ai 超頻設為手動, 企圖禁止它偷跑; 由於設錯了其他東西, 它還是毫無人性地把 CPU 從 3.4 GHz 超到 4.4 GHz. 然後告訴我開不了機. 

原來把 memory clock rate 降低, 搭配 BCLK / PCIE 比例設高也不行. 嘗試了幾次後, 最後的結論是: Ai 仍舊設為手動, Memory 設為 1333MHz (雖然我買 1600 MHz), BCLK / PCIE = 100 (設太低也會開不了機), Turbo 倍頻設自動, 然後 CPU 就會乖乖地停在 3.4GHz 了.

畢竟中間當了那麼多次, 硬碟沒病也變有病了! 於是我把 C 槽備份後, 做了一個晚上的 check disk. 然後重灌一次 Win7. 雖然我先前都用得好好的, 但是有些小地方讓我不太滿意. 像是金山毒霸會導致 iPad 偵測不到 (disable 後就可以, 不用移除.), 而且它把別人的首頁綁架軟體關了, 自己卻占住了首頁! 這些雜七雜八的軟體 (快播, 金山…) 都會一直開 pop 視窗, 也讓人煩不勝煩. 乾脆就來個浴火重生吧!

果然, 經過鎖定 CPU 頻率, check disk 之後, Everest 可以順利跑完了. 重灌之後, 試玩了 NBA2K14 也沒再當機. 經過一番波折, 我大概歸納出以下的結論:

1. 跑 memtest86, 若是能跑完 1 個 pass (大概一個晚上),表示 memory 基本上沒問題.

2. 如果進到 BIOS, 或是看 Everest 的 5V, 12V 電壓大概也在 5V, 12V 附近, 那麼 power 也沒有問題.

3. 能跑完 3D Mark, 顯示卡大概也沒問題.

4. 確定電腦不會自行超頻, 設定完成後, 重新開機看一次有沒有變化.

5. 檢查硬碟很重要. 2TB 大小也是要花ㄧ個晚上, 但值得做!

以上分享自己當機的悲慘經驗, 希望大家都可以迅速地解決問題. 因為計劃趕不上變化, 本篇還有些插曲, 我另外再寫兩篇給大家參考.

«深入淺出 – Android 系統移植與開發測試» 的補充

這本書的發行的時候, Android 的版本只是 2.2. 現在 Android 已經到 4.2 版了, 所以有些內容需要修改. 我把需要改變的地方整理如下:

0. 首先要安裝 64 bit 的 ubuntu

如果沒有光碟機, 會有點小麻煩. 因為 ubuntu 的 Windows installer 預設是安裝 32 bit 版本. 所以要先下載 64 bit (amd64) 版, 然後手動選取 iso 檔.

如果一定要用 ubuntu 32 bit 版本, 請參考這一篇 [註 0].

1. 在 ubuntu 上安裝以下的套件, 修改的地方用紅色, 並新增第四行.

sudo apt-get install git-core flex bison gperf libesd0-dev zip

sudo apt-get install libwxgtk2.8-dev zlib1g-dev build-essential libstdc++5

sudo apt-get install tofrodos  x-dev libx11-dev lib32ncurses5-dev xsltproc

sudo apt-get install gcc-multilib g++-multilib libc6-dev-i386 ia32-libs x11proto-core-dev lib32readline-gplv2-dev lib32z1-dev [註 1]

如果 apt-get 失敗, 請參考這篇 “回覆: 最近在安裝新的10.10無法更新


接下來就是 Java 了, 基本上 Java 套件會找不到. 所以要先讓 ubuntu 可以安裝過期軟體 [註 2].

apt-add-repository “deb http://old-releases.ubuntu.com/ubuntu/ jaunty multiverse"
apt-add-repository “deb http://old-releases.ubuntu.com/ubuntu/ jaunty-updates multiverse"

此時在 /etc/apt/sources.list 的最後四行會看到:

deb http://old-releases.ubuntu.com/ubuntu/ jaunty multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ jaunty multiverse
deb http://old-releases.ubuntu.com/ubuntu/ jaunty-updates multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ jaunty-updates multiverse

接著就可以更新 source list.

sudo apt-get update

sudo apt-get install sun-java6-jdk


再來就可以安裝 repo.

cd ~/bin

curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo

chmod a+x ~/bin/repo

PATH=~/bin:$PATH


再來取得 Android source code.

repo init -u https://android.googlesource.com/platform/manifest.git

repo sync

經過了不知道多久….

接著做設定

lunch

畫面出現

You’re building on Linux

Lunch menu… pick a combo:
     1. full-eng
     2. full_x86-eng
     3. vbox_x86-eng
     4. full_mips-eng
     5. full_grouper-userdebug
     6. full_tilapia-userdebug
     7. mini_armv7a_neon-userdebug
     8. mini_armv7a-userdebug
     9. mini_mips-userdebug
     10. mini_x86-userdebug
     11. full_phantasm-userdebug
     12. full_mako-userdebug
     13. full_maguro-userdebug
     14. full_manta-userdebug
     15. full_toroplus-userdebug
     16. full_toro-userdebug
     17. full_panda-userdebug

Which would you like? [full-eng]

預設就是第一項 full-eng.

make

如果 64 bits 編譯工具沒弄好, 可能看到錯誤訊息:

prebuilts/tools/gcc-sdk/gcc: line 40: prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/i686-linux-glibc2.7-4.6/bin/i686-linux-gcc:

用了這招可以修好 [註 3]

cd prebuilts/tools ; git reset –hard HEAD^
cd external/qemu ; git reset –hard d4f5a3ae87a7246613188940c1667bf2880da402

如果看到

/bin/bash: prebuilt/linux-x86/sdl/bin/sdl-config: No such file or directory
/bin/bash: prebuilt/linux-x86/sdl/bin/
sdl-config: No such file or directory

可能是 repo init 時設錯. 我發現我是設錯 username, 此時用

repo init –config-name 重設一次 username 和 email address


錦上添花的設定:

1. 減少不必要的編譯.

export USE_CCACHE=1

2. 設定 USB 設備:

sudo vim /etc/udev/rules.d/51-android.rules
加入設定指令, 讓 Android user 可以直接使用 USB 設備, 忽略到 OWNER 就變成是 root 才能訪問.

# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1″, ATTR{idProduct}=="4e12″, MODE="0600″, OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4″, ATTR{idProduct}=="0fff", MODE="0600″, OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1″, ATTR{idProduct}=="4e22″, MODE="0600″, OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1″, ATTR{idProduct}=="4e20″, MODE="0600″, OWNER="<username>"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8″, ATTR{idProduct}=="70a9″, MODE="0600″, OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1″, ATTR{idProduct}=="708c", MODE="0600″, OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8″, ATTR{idProduct}=="6860″, MODE="0600″, OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1″, ATTR{idProduct}=="4e30″, MODE="0600″, OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451″, ATTR{idProduct}=="d101″, MODE="0600″, OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451″, ATTR{idProduct}=="d022″, MODE="0600″, OWNER="<username>"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451″, ATTR{idProduct}=="d010″, MODE="0600″, OWNER="<username>"

sudo chmod a+rx /etc/udev/rules.d/51-android.rules


[註 0] ubuntu 11.10(32位系统)下编译android源码

[註 1] Ubuntu 64 bit 编译 Android

[註 2] ubuntu安裝sun-java5-jdk

[註 3] wrappers for 32/64-bit using wrong path?

[註 4] [Linux]ubuntu 11.04(64 bit)抓取android4.0.4原始碼跟編譯source code/SDK/kernel

OpenGL on Win7 64bits

在 Windows 上使用 OpenGL 的函式庫需要幾樣東西, 我假設大家都裝了免費的 Visual Studio Express 2010 版, 那麼:

1. glut.h  放在 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\gl

2. glut.lib 和 glut32.lb 放在 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib

3. glut.dll 和 glut32.dll 放在 c:\windows\system32

不過如果是 64 bits 的作業系統, glut32 要放到 C:\Windows\SysWOW64 裡面. 不然程式寫好也會說不能啟動, 因為找不到 glut32.dll.

什麼是 glut 呢? 它是 OpenGL Utility Toolkit 的縮寫, 即使版本比較舊也都可以用. 至於 sysWOW64 的意思是 Windows-on-Windows 64bit , 可以讓 64 bits Windows 執行 32 bits 的程式. 這也就是為什麼 Glut32.dll 要放到這個目錄的原因.

[ref]

1. Microsoft Visual Studio 2008安裝 GLUT for Windows7 64bit

2. andyhuabing的专栏

3. WIKI: GLUT

4. 補充說明 SysWoW64 目錄