タイトル/名前 | 更新者 | 更新日 |
---|---|---|
読書メモ/「Windows ダンプの極意」 | msakamoto-sf | 2011-04-02 16:21:13 |
読書メモ/"Advanced .NET Debugging" | msakamoto-sf | 2011-04-02 16:21:05 |
C言語系/memos/VC++/13, _NT_SYMBOL_PATH環境変数に注意 | msakamoto-sf | 2011-04-02 16:20:56 |
技術/Windows/WinDbgメモ | msakamoto-sf | 2011-04-02 16:20:23 |
Python/WinDBG拡張機能でデバッガを作ってみる | msakamoto-sf | 2011-04-02 16:20:06 |
日記/2011/03/21/千葉県香取市粉名口の自宅近辺液状化 | msakamoto-sf | 2011-03-21 21:57:28 |
日記/2011/03/21/放射能とか半減期とか | msakamoto-sf | 2011-03-21 21:34:18 |
Python/codepiece/threading, event, console, Ctrl-C | msakamoto-sf | 2011-03-11 13:40:50 |
日記/2011/03/04/cheap2elのWin7問題がSP1で治ったみたい | msakamoto-sf | 2011-03-04 15:25:31 |
技術/Windows/UI Automation | msakamoto-sf | 2011-03-04 14:15:41 |
WindowsOSのBSOD発生後、あるいはアプリクラッシュ後のメモリダンプから障害発生の原因を調べるための手引書です。
主に使うツールはおなじみのWinDBG。"Advanced Windows Debugging"のChapter13, "Postmortem Debugging" を抜き出して、必要最低限度のデバッガやCPUアーキテクチャの解説を付け足し、メモリダンプの解析の流れをメインに据えた一冊ともいえます。
内容的にAWD本とかぶる部分も多いですが、こちらはメモリダンプ、それもOS全体のメモリダンプ解析をメインに据えています。
著者が実際に使用したサンプルプログラムやサンプルのデバイスドライバが公開されていないので、「手を動かして学べる」タイプの書籍ではありません。とはいえ、読んでいるだけでもトラブルシューティングの現場の臨場感を感じることが出来て、面白かったです。
他関連記事:
読書メモ/"Advanced Windows Debugging" の続編。
.NETアプリケーションのデバッグにおける、"Debugging Tools for Windows"やMS謹製のフリーツールの使用方法や問題分析の流れを詳しく解説している。
内容の詳細はアマゾンなどを参照して欲しい。
個人的なお薦めポイントとしては、CLRと.NET Frameworkの関係、「アセンブリ」の概念とロード機構、CLRのヒープ管理とGC、ファイナライズキューなどなどの、.NETで今ひとつ分かりづらいけど重要な「裏舞台」を分かりやすく紹介してくれている点。.NET入門者にとっては呪文めいた「アセンブリ」や「マニフェスト」といった用語がきちんと解説されている。
注意点としては、実際のデバッグの流れが掲載されているが、若干の省略が見られる点。特に
.loadby sos mscorwks
は省略されがちに思えた。デバッグコマンドが一つ一つ書かれているからと言って、その通りに最初から打ち込んでもうまくいかない原因は大抵、こうした前提となるイロハのコマンドが省略されているから。そこだけ注意が必要。
他にも何気にtypoミスがあったり、酷いところでは公式HPからDLできるサンプルコードに抜けがあったりする。下記HPを参照のこと。
いくつか「編集者真面目に仕事したのか・・・?」と首を傾げる点はあるものの、本書の価値を損なうほどのものではない。.NETアプリの開発に携わる人達であれば一読しておいて損はない一冊となっている。
"Debugging Tools for Windows"のwindbgなどを使い始めると、_NT_SYMBOL_PATH環境変数をシステムに設定したりすると思います。
この環境変数ですが、Visual C++ もちゃっかり使ってたりします。
で、値の書き方によってはVC++側でシンボルサーバーまで読みに行ったりローカルキャッシュからの検索などが思うようにスムーズに動かず、デバッグ実行時に数分以上の遅延が発生する場合があります。
書き方によってはVC++側でも素早くローカルキャッシュを見に行ってくれます。
というわけで、もし _NT_SYMBOL_PATH 環境変数を設定したらやたらVC++側のデバッグ実行が遅くなった、という人は書き方を工夫してみてください。
自分の場合、windbgの勉強中にこういうふうに設定したのですが・・・
cache*C:\in_vitro\tmp\symcache;srv*C:\in_vitro\tmp\awd_symstore\symstore.pri; \ srv*http://msdl.microsoft.com/download/symbols
VC++側ではやたらと遅延が発生してしまいました。"cache"を明示したり、";"で区切ったりしたのがいけなかったのでしょうか?→ 誤解してました。cacheが効かない+ローカルキャッシュとシンボルサーバの区切り文字を混同してました。 技術/Windows/WinDbgメモ 参照。
試行錯誤してこんなふうに直してみたら、windbgもVC++側も双方、すんなり動いてくれました。
srv*C:\in_vitro\tmp\symcache*C:\in_vitro\tmp\awd_symstore\symstore.pri; \ http://msdl.microsoft.com/download/symbols
実験環境:
Win7 (x86,32bit) 日本語版 Visual C++ 2008 Express Edition SP1 Windows SDK v7.0
参考:
WinDBG参考図書:
※"AWD"サンプルコードのシンボルパスについて
本書中で紹介されているURLは2011年1月の時点でアクセス不能になっている。
http://www.advancedwindowsdebugging.com/symbols/symstore.pri
このため、"AWD"公式HPからダウンロードしたプライベートシンボルファイルをローカルPC上に展開し、そちらへのパスをシンボルパスに設定する必要がある。
WinDBGやWindowsデバッグ関連参考サイト:
"Debugging Tools for Windows"の提供する拡張機能をPythonから呼び出せるPyDbgEngを使って、Pythonで簡単なデバッガを作ってみました。
2011/03/11の地震は津田沼で迎えた。千葉県香取市粉名口の実家は兄とジジババの3人暮らしで基本無事だが、周囲に泥が吹き出して液状化が云々とのこと。
03/13に成田~銚子間が動き出したので様子を見に行ったところ、周囲の道路が波打っていたりところどころ陥没したり、さらには電柱も大きく傾いたりとそれなりの被害をうけていた。
03/13の時点では泥も乾き、重機で寄せて掬い上げる事が出来る程度にはなっていた。近所の工事業者がボランティアでブルドーザーやシャベルを持ってきて片付けに追われていた。
兄は市内の介護施設で働いており、その間はジジババだけになる。上水道が止まっているため給水所との往復でどうしても人手が必要となる。ジジババは二人とも高齢で耳が遠かったり脳卒中の後遺症で言葉がうまく出てこない。大きめの余震も続くし、緊急時ということで電話のやりとりや近所の連絡、お見舞いに来た人とのやりとりをする留守番も必要だ。
ということで、兄が二日連続の休みをとれる今日まで実家で過ごし、今日ようやく津田沼のアパートに一旦戻ってきた次第。また明日には実家に戻り、留守番を続けることになる。
03/18時点、近所の十間川:湧きでてきた泥については半分ほど片付けられたらしい。
03/18時点、近所の電柱遠景:とりあえず電気が通ったので助かっているが、いずれは土台から工事して電柱を取り替える必要があるだろう。
香取市HPより、その他の写真:
3/22より八千代市の支援で応急措置として上水道の工事が始まるようだ。とりあえず上水道が復旧し、ジジババが地震前の生活リズムを取り戻せるまでは実家を手伝うことになるだろう。
3/13に津田沼を発ったときはまさか何日も留守番することになるとは予想していなかったため、ノートPCも持ってこなかった。
今度はノートPCやネット環境を準備し、手持ち無沙汰になることが無いようにしたい。
3/12日よりこちら、ずっと実家でジジババの留守番やご飯の支度などで、合間合間にNHKとかで原発ニュースを見ていて、「まぁ今のところ千葉県や東京都周りは放射能の心配は要らないか。」と安心したのもつかの間、ようやく津田沼に戻ってきてWebを見てみたらまぁあっちこっちで「内部被曝がどーのこーど」とか2ch系のまとめサイトでは「日本もう\(^o^)/オワタ」系のコメントで人様の不安とか恐怖心をカリカリ掻きむしったりとか、なんだこりゃ、Web見てても一向に安心できねぇやと暫く眺めてたら。
ふと、「あ、そーいえば高校の物理で半減期とか習った記憶があるな」と、試しにほうれん草や原乳で基準値超えて話題になっている放射性同位体のヨウ素131の半減期を調べてみたら8.02日だったよ。半減期は指数関数的に作用するので、数日経ってしまえば放射性は非常に弱くなってしまい、影響ないということか。
個人的には政府の公式報道を第一として信じるほかない、と思っているので2011/03/21現時点ではそれほど心配はしていない。
千葉県・東京都の範囲で風に乗ってくる放射性物質による被爆を心配するくらいなら、まずは日常の病気や交通事故に注意すべきだと思う。
参考:
ソースが偏ってしまったけど、ほうれん草の話題では半減期に言及していたり、空気中の放射性物質濃度の推移を1960年代からのデータを見せつつ解説してくれているということでとりあえず参考。
かなりニッチなモデルについて実験。
スレッド1の監視処理はbusyループではなく、TimeOut付きの短期間のwait()を無限ループ中で呼び出すイメージ。
スレッド1の初期状態は監視処理モード。スレッド2による切り替えで対話形式処理モードに遷移する。
対話形式処理モードにおいて監視処理への切り替えコマンドを受け取ると、再び監視処理モードに遷移する。
スレッド間の連携については threading.Event を使ってみる。
予備実験として threading.Event を使ったスレッド間連携を試してみる。
thread_and_event1.py:
import threading import time def mythread(myevent): count = 1 while True: myevent.wait(1) print "wakeup(%d)" % (count) count += 1 if myevent.isSet(): print "break" break event = threading.Event() t = threading.Thread(target=mythread, args=(event,)) t.start() # 5秒後にevent発生 time.sleep(5) print "(main):event set" event.set() t.join()
実行例(Python2.5)
> python thread_and_event1.py wakeup(1) wakeup(2) wakeup(3) wakeup(4) (main):event set wakeup(5) break >
予備実験で threading.Event によるスレッド間連携を確認できた。
本題となるモード切り替えやCtrl-Cによるスレッド連携の実装サンプル:
thread_and_event2.py:
import threading import time import signal def mythread(myevent): busy_work = threading.Event() # 小刻みな監視処理用のダミーEvent continue_flag = True count = 1 while continue_flag: # 小刻みな監視処理 if busy_work.wait(1): print "Never happen" else: print "mythread(%d)" % (count) count += 1 # 連携イベントをチェック myevent.wait(1) if myevent.isSet(): print "Interrupted" # 対話形式スタート while True: command = raw_input(">>") if command == "q": continue_flag = False break # 監視処理に戻る+フラグにより終了へ elif command == "g": break # 監視処理に戻る else: print "You type: " + command myevent.clear() print "end" event = threading.Event() t = threading.Thread(target=mythread, args=(event,)) t.start() while True: try: # 1秒間ずつスレッドの終了チェック t.join(1) if not t.isAlive(): break except KeyboardInterrupt: # Ctrl-C による割り込み発生 print "interruption set" event.set()
実行例(Python2.5)
> python thread_and_event2.py mythread(1) mythread(2) mythread(3) (Ctrl-C) interruption set Interrupted >>foo You type: foo >>bar You type: bar >>g mythread(4) mythread(5) (Ctrl-C) interruption set mythread(6) Interrupted >>abc You type: abc >>q end >
Ctrl-Cによる監視→対話へ切り替え、対話形式でのコマンド入力による監視モードへの復帰やスレッドの終了を実現できた。
なお raw_input() 中に Ctrl-C を受信するとEOFErrorが発生する点に注意が必要。
EOF発生時には空文字列入力として続行する例:
# 対話形式スタート while True: command = raw_input(">>")
→
# 対話形式スタート while True: command = "" try: command = raw_input(">") except EOFError: pass
以前 日記/2010/11/13/Win7でcheap2elのサンプルが一部動かない・・・ で挙げた、cheap2el添付のサンプルの一つ、DLLインジェクションするサンプルがWindows7で動作しない問題ですが、SP1に上げた後試してみたら治っている模様。
インジェクションされたDLLコードがちゃんと動作してました。デバッガ有無も関係なし。
SP1でのHotfixなど細かい変更点を追おうと思ったのですが・・・
ここ経由でHotfixの一覧Excelシートを入手できたものの、796もの変更点が登録されています。
ということで細かい変更点を追うことは諦め、readmeなど適当なファイルに注意書きとして「Win7で使うときはSP1にUPしてね」を追加するにとどめておきます。
Microsoft UI Automation のメモ。
XP, Svr2003, Vista, 7, Svr2008 以降でサポートしてる、UIの自動化機構。
参考: