[Debugging] Windbg を使ってご機嫌ナナメな彼女の心を激しくデバッグ!(1) / 3
みなさまごきげんよう。ういこです。
何か風邪ひいて明らかに熱っぽいんですが、皆さんお体はいかがですか。ミッドナイトな勤務が多い管理者様にはプロテインと、医薬品のローヤルゼリーとアミノコラーゲンとアミノバイタルを牛乳に溶かしてプロテインも加えて激しく憎しみを込めてシェイクしたものを寝る前に養命酒と一緒に飲むと良いです。私は最近それを怠っていたのでした。しょぼーん。
さて熱があってもむしろこのハイなグルーヴ感を生かして書いたら面白い文章かけるんじゃないかと思ったので書いてます。
今日のネタは、一部の人にしか絶対受けないだろうと思う Debugging Tools for Windows - WinDBG の簡単な使い方、です。長いのでたぶん「待て次号!」になると思います。
【今日のお題】
ステップ実行だけがデバッグじゃない!
Debugging Tools For Windows でご機嫌斜めなあのコをデバッグ!
~ その 1 ~
[Debugging] Windbg を使ってご機嫌ナナメな彼女の心を激しくデバッグ!(1) ★ ← 今回
https://blogs.technet.com/jpilmblg/archive/2009/02/21/debugging-windbg-1.aspx
[Debugging] Windbg を使ってご機嫌ナナメな彼女の心を激しくデバッグ!(2) Ver 1.1
https://blogs.technet.com/jpilmblg/archive/2009/02/25/debugging-windbg-2.aspx
[Debugging] Windbg を使ってご機嫌ナナメな彼女の心を激しくデバッグ!(3)
https://blogs.technet.com/jpilmblg/archive/2009/03/06/debugging-windbg-3-tips.aspx
はじめに言えば、結構癖のあるツールです。
でも、モノにすると、自分の技術の世界が確実に広がります。
デバッグをするとき、Echo を入れている。
ステップ実行をしている。
ステップ実行だけがデバッグじゃないです。Visual Studio も相当強力ですが、有償ですし、Express Edition の機能以上のことをしたいと思ったときの選択肢を増やすという意味でもお勧めしたいです。さあ、ご機嫌ナナメで例外をはきまくってる彼女を激しくデバッグしてやろうじゃないですか!
[1] インストール、環境設定
インストールについては、こちらのリンクよりダウンロードしてそのままインストーラをキックすれば入っちゃいます。これ以降、環境を以下のように例にとって説明します。
基本、Vista だろうが XP だろうが、Windows 2000 だろうが 2003 Server だろうが変わらないです。安心して設定しちゃいましょう。
インストールパス = C:\Debuggers
私のスタイルとしては、[スタート] - [ファイル名を指定して実行] (Windows キー + R キー) で
windbg
とタイプして [OK] 押して実行させたいとか、インストール パス配下のモジュールを読み込むとき便利なのでシステムの環境変数 PATH に上記のインストール パスを入れちゃってます。
[2] 起動してみる
起動は [スタート] - [すべてのプログラム] - [Debugging Tools for Windows (x86)] の下に、WinDbg がいるのでそれをクリックするもよし、[スタート] - [ファイル名を指定して実行] (Windows キー + R キー) で windbg とタイプして [OK] 押しちゃうでもよし。
起動するとこんな感じです。
Debuggee Not Connected の字が無常感をそそりますね。なんか何にもできない感じ…。
でもこの状態でこそできることがあります。それは、シンボル情報など、環境全般の設定。この状態で設定した情報は、それ以降の windbg の起動時の設定に引き継がれます。
ではそのうち一番大事な "シンボル情報" を設定してみましょう。
デバッグ シンボル パスを設定する
「デバッグ シンボル」はデバッグしたい対象のプログラムをデバッグする際に役立つ情報です。拡張子は *.pdb がほとんどです。デバッグ シンボルは、プログラムをビルドしたときに一緒に生成されます。(VS の規定の設定でも作成される) デバッグ時、デバッグ対象のプログラムのシンボル情報があると、デバッガはメモリ アドレスだけでなく、関数名や変数の名前も表示します。
シンボルがない場合、オフセット値がすさまじくでっかくなります。シンボルがないならアセンブラをお召し上がりになればよろしいのではなくて? というデバッグ セレブの方もいらっしゃるかもしれませんが、私は普通の主婦なのでシンボルが欲しいですね。下手すると、関数すらわからなくて、フレーム全部が IMJPAPI!DllUnregisterServer+0xXXXXX みたいになっちゃうこともあるのですもの。全部その関数なわけないだろう!見たいな突っ込みいれたくなります。
それに、問題を見つけても、そのモジュールの作成者に対して具体的にどこの関数のさらにどこの部分、と指摘できないって非効率ですし。
皆さんプログラムを作成される際は、問題が発生したときを考えてシンボルは捨てないのをお勧めします。
能書きが長くなりましたが設定方法をご説明しましょう。
シンボルをローカルにストアするパスは C:\Symbols.Pub にしているとします。
1. [File] - [Symbol File Path ...] を選択します。
2. "Symbol Search Path" ダイアログが開くので、以下の構文をペーストしましょう。
SRV*<ローカルのシンボルのダウンロード先のフォルダ>*https://msdl.microsoft.com/download/symbols
上記例をとった場合はこんな感じ
SRV*C:\Symbols.Pub*https://msdl.microsoft.com/download/symbols
[OK] をクリックします。
3. Windbg をいったん閉じます。このとき、以下のようなダイアログが出ますが、負けずに OK を押してやりましょう。これでこの設定が次も生かされます。
ちなみに、実行中にシンボルパスを設定することもできます。たとえば新しいシンボルパスがわかって、ふやしたいときが出てきたときなどに便利です。
> .sympath+ https://msdl.microsoft.com/download/symbols
.sympath+ コマンドを実行すると、シンボルパスが追加設定され、新しいパスが通知されます。
上記例では、切れちゃってますけど実際にはこんな風になってます。
まず、.sympath コマンドで今のシンボルパスはどんなかなと見てみています。
0:004> .sympath
Symbol search path is: SRV*C:\Symbols.Pub*https://msdl.microsoft.com/download/symbols
.sympath+ でインターナルのサーバ \\symbols\symbols にデバッグシンボルがしこたまあると聞いたので、追加してみました。
0:004> .sympath+ SRV*\\symbols\symbols;
Symbol search path is: SRV*C:\Symbols.Pub*https://msdl.microsoft.com/download/symbols;SRV\*\\\\symbols\\symbols
おお、増えてる増えてる。
ちなみに、システムの環境変数に _NT_SYMBOL_PATH という名前のをつくって、そこに上記のパスを設定することもできますが、昔の VS とか使ってるとVS を起動したときにここを見に行っておそくなることがあるので、windbg は windbg、VS さまは VS さまというようにすみわけをさせるのが使いやすいかな、と思います。(個人的な感想)
つぎはいよいよ使ってまいります。お楽しみに。
~ういこう@頭痛い~