一般ユーザーができる(?)BSODの解析 [ドライバ開発]
前にも何回か書いた気もするが
ドライバ開発者でなくても、何が原因かは調べられるので一応書いておく
・c:\windows\memory.dmpができているかどうか
サスペンド、ハイバネートなどで出来ない場合がある。そういう場合はストレージのエラーであることが多い。memory.dmpを保存するためのストレージが無いために保存出来ていないためである。よってストレージを疑う。
・memory.dmpがある場合
windbgで調べる。
http://msdn.microsoft.com/ja-jp/windows/hardware/gg462988 から落としてくる。
落としてきた後、一番下に書いてある
SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols
をイメージパスに指定するのでコピペしておく。
・何が原因か
windbgを起動した後、Fileメニューから「イメージを読み込む」的なやつがあるので、それを選んでmemory.dmpを食わせる。
すると、クラッシュしたときのメモリの状態が大体わかる。CallStackを見てみると、どのドライバが動作中にクラッシュしたかがわかる。
ドライバを開発している場合、これでソースコードを見れば一発で大体わかることが多いのだが、自分で開発していないドライバが原因の場合、理由を特定するのは非常に困難が伴う。
nt!XXXとか書かれているところはWindowsのコールスタックなので、あまり意味が無い。サードパーティの用意したドライバで出ているとそのメーカーが悪い可能性が高い。
2,3度やったことがあるが、以下のような感じ。
・ウィルスバスター
CallStackにウィルスバスターのファイルシステムフィルタドライバが存在していた。
そのPCはメモリが異常に少なかったので、メモリを増やしたところBSODはでなくなった。
原因はメモリが少ない状態でウィルスバスターがメモリを確保できずにBSODを出していた、と予想しているが、そこまで解析するには逆アセンブルでExAllocatePagesWithTagが呼ばれていることを調べないといけない。そこまでやる前に解決したので放置。
・さっぱりわからん場合
引き金となったドライバが、影響で別の箇所に影響をおよぼすことは非常に多い。特にWindowsはマルチスレッド環境なので、あるスレッドが悪さをした結果別のスレッドでクラッシュするということは多い。
・そこから根性を出す場合
ターゲットとなるドライバを逆アセンブルする。
http://www.hex-rays.com/idapro/idadownfreeware.htm
IDA Pro FreeがWindowsのシステムコールを判別してくれるので使いやすい。
が、普通はコンパイラに任せるところを、人間がやるので非常に手間がかかる。レジスタに何が入っているかを推測しつつ、動作。これはmemory.dmpでメモリを見れればベターだが、多分見れないだろう。
・さらにさらに根性を出す
先程の解析であたりがついているはずなので、メモリの状況を調べる。
windbgを利用して、Windowsをリモートデバッグする。WindowsVista以降はbcdeditを使う
bcdedit /copy {current} /d DebugEntry
{GUID}が表示される
bcdedit /debug {GUID} on
bcdedit /displayorder {GUID} /addlast
PCを再起動すると、メニューが出てくるので「DebugEntry」を選ぶ。
でBSODを出す。
これでメモリの状況を調べることもできる。
例えば特定のメモリを見ようとしても何も表示されないとかは解放されているメモリを参照している場合がある。
しかし本当に根性出して調べないとここまではわからんので、NEETか学生かどーしても原因を特定する必要のある職業でやってる人以外はここまではできないだろう。
ここまで書いておいてなんだが、PCが不調の場合
・MEMTESTが完走するかどうか
http://www.memtest.org/
CDに焼く必要がある。CD-RW推奨。いい加減USBメモリブートできてもいい気はする。
P4時代に一度ハマって以来安すぎるメモリは買わないことにした。時間の無駄。
それでもPCを買ってきたら一晩ぐらい動かしてみたほうがいい。自分は一周(20分ぐらい)すれば十分だとは思ってるが。
・CrystalDiskInfoで不良セクタが発生していないかどうか
一度データが化けていると再インストールしない限り不安定になる。
http://crystalmark.info/software/CrystalDiskInfo/
ただ、不良セクタの扱いも最近の大容量化では難しい。1個や2個ぐらいあってもおかしくないし、ケーブルの接続不良や電源の不安定さでかなり多発する。本当にHDDがおかしいかどうかは微妙な面もある。
ただ(*2)、ディスクの温度がかなり高い場合(50度以上)は熱で寿命がきている可能性はある。さっさと交換推奨。
・CoreTempで異常な温度(70度以上)にならないかどうか
http://www.alcpu.com/CoreTemp/
個人的な経験だが、70度超える環境はアウト。意地でも60度台は死守できないとおかしい。
ちなみにうちの環境は50度前後。
・ウィルススキャンして異常がないかどうか
自分はAvira入れてるが、2ch的にはAvastのほうがメジャー。
http://www.avira.com/ja/avira-free-antivirus
自分ではありえないが、無防備でインターネットにつないでいる人が多いので、そういう人は大抵このパターン。
が最低限チェックする項目かなぁ。
BSODが出るタイミング以前にPCがそもそも正常な状態かどうかは必須である。
ちなみに知り合い二人が最近よく落ちるといってたが、その後ウィルスが見つかっていた。なのでこれらは最初のチェック項目だろう。
ただ、ウィルススキャンも最近は広告系のたいしたことがないやつも表示するので、表示をよく読まないと本当に問題があるかどうかは不明。
実は無防備でPCを使っていた場合、システムファイルを破壊されている可能性があるので、ウィルススキャンで駆除しても治らない可能性も高い。そういう場合は再インストールになる。
なんか結局まとまらなかったので、また思いついたら更新する。
ドライバ開発者でなくても、何が原因かは調べられるので一応書いておく
・c:\windows\memory.dmpができているかどうか
サスペンド、ハイバネートなどで出来ない場合がある。そういう場合はストレージのエラーであることが多い。memory.dmpを保存するためのストレージが無いために保存出来ていないためである。よってストレージを疑う。
・memory.dmpがある場合
windbgで調べる。
http://msdn.microsoft.com/ja-jp/windows/hardware/gg462988 から落としてくる。
落としてきた後、一番下に書いてある
SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols
をイメージパスに指定するのでコピペしておく。
・何が原因か
windbgを起動した後、Fileメニューから「イメージを読み込む」的なやつがあるので、それを選んでmemory.dmpを食わせる。
すると、クラッシュしたときのメモリの状態が大体わかる。CallStackを見てみると、どのドライバが動作中にクラッシュしたかがわかる。
ドライバを開発している場合、これでソースコードを見れば一発で大体わかることが多いのだが、自分で開発していないドライバが原因の場合、理由を特定するのは非常に困難が伴う。
nt!XXXとか書かれているところはWindowsのコールスタックなので、あまり意味が無い。サードパーティの用意したドライバで出ているとそのメーカーが悪い可能性が高い。
2,3度やったことがあるが、以下のような感じ。
・ウィルスバスター
CallStackにウィルスバスターのファイルシステムフィルタドライバが存在していた。
そのPCはメモリが異常に少なかったので、メモリを増やしたところBSODはでなくなった。
原因はメモリが少ない状態でウィルスバスターがメモリを確保できずにBSODを出していた、と予想しているが、そこまで解析するには逆アセンブルでExAllocatePagesWithTagが呼ばれていることを調べないといけない。そこまでやる前に解決したので放置。
・さっぱりわからん場合
引き金となったドライバが、影響で別の箇所に影響をおよぼすことは非常に多い。特にWindowsはマルチスレッド環境なので、あるスレッドが悪さをした結果別のスレッドでクラッシュするということは多い。
・そこから根性を出す場合
ターゲットとなるドライバを逆アセンブルする。
http://www.hex-rays.com/idapro/idadownfreeware.htm
IDA Pro FreeがWindowsのシステムコールを判別してくれるので使いやすい。
が、普通はコンパイラに任せるところを、人間がやるので非常に手間がかかる。レジスタに何が入っているかを推測しつつ、動作。これはmemory.dmpでメモリを見れればベターだが、多分見れないだろう。
・さらにさらに根性を出す
先程の解析であたりがついているはずなので、メモリの状況を調べる。
windbgを利用して、Windowsをリモートデバッグする。WindowsVista以降はbcdeditを使う
bcdedit /copy {current} /d DebugEntry
{GUID}が表示される
bcdedit /debug {GUID} on
bcdedit /displayorder {GUID} /addlast
PCを再起動すると、メニューが出てくるので「DebugEntry」を選ぶ。
でBSODを出す。
これでメモリの状況を調べることもできる。
例えば特定のメモリを見ようとしても何も表示されないとかは解放されているメモリを参照している場合がある。
しかし本当に根性出して調べないとここまではわからんので、NEETか学生かどーしても原因を特定する必要のある職業でやってる人以外はここまではできないだろう。
ここまで書いておいてなんだが、PCが不調の場合
・MEMTESTが完走するかどうか
http://www.memtest.org/
CDに焼く必要がある。CD-RW推奨。いい加減USBメモリブートできてもいい気はする。
P4時代に一度ハマって以来安すぎるメモリは買わないことにした。時間の無駄。
それでもPCを買ってきたら一晩ぐらい動かしてみたほうがいい。自分は一周(20分ぐらい)すれば十分だとは思ってるが。
・CrystalDiskInfoで不良セクタが発生していないかどうか
一度データが化けていると再インストールしない限り不安定になる。
http://crystalmark.info/software/CrystalDiskInfo/
ただ、不良セクタの扱いも最近の大容量化では難しい。1個や2個ぐらいあってもおかしくないし、ケーブルの接続不良や電源の不安定さでかなり多発する。本当にHDDがおかしいかどうかは微妙な面もある。
ただ(*2)、ディスクの温度がかなり高い場合(50度以上)は熱で寿命がきている可能性はある。さっさと交換推奨。
・CoreTempで異常な温度(70度以上)にならないかどうか
http://www.alcpu.com/CoreTemp/
個人的な経験だが、70度超える環境はアウト。意地でも60度台は死守できないとおかしい。
ちなみにうちの環境は50度前後。
・ウィルススキャンして異常がないかどうか
自分はAvira入れてるが、2ch的にはAvastのほうがメジャー。
http://www.avira.com/ja/avira-free-antivirus
自分ではありえないが、無防備でインターネットにつないでいる人が多いので、そういう人は大抵このパターン。
が最低限チェックする項目かなぁ。
BSODが出るタイミング以前にPCがそもそも正常な状態かどうかは必須である。
ちなみに知り合い二人が最近よく落ちるといってたが、その後ウィルスが見つかっていた。なのでこれらは最初のチェック項目だろう。
ただ、ウィルススキャンも最近は広告系のたいしたことがないやつも表示するので、表示をよく読まないと本当に問題があるかどうかは不明。
実は無防備でPCを使っていた場合、システムファイルを破壊されている可能性があるので、ウィルススキャンで駆除しても治らない可能性も高い。そういう場合は再インストールになる。
なんか結局まとまらなかったので、また思いついたら更新する。
コメント 0