9

コンピューターのデバッグの複雑さを学び始めたばかりの人間として、Windbg でダンプのスタック テキストを読み取る方法を一生理解できません。それらをどのように解釈するか、またはどのようにそれを行うかについて、どこから始めればよいかわかりません。この哀れな魂に道を教えてくれる人はいますか?

すなわち(私が実際に手元に持っている唯一のダンプ)

>b69dd8f0 bfa1e255 016d2fc0 89efc000 00000040 nv4_disp+0x48b94

b69dd8f4 016d2fc0 89efc000 00000040 00000006 nv4_disp+0x49255

b69dd8f8 89efc000 00000040 00000006 bfa1dcc0 0x16d2fc0

b69dd8fc 00000000 00000006 bfa1dcc0 e1e71018 0x89efc000

問題が Nvidia ディスプレイ ドライバに関係していることはわかっていますが、知りたいのは実際にスタックを読み取る方法です (たとえば、b69dd8f4 とは何ですか?) :-[

4

3 に答える 3

18

まず、適切なシンボルを構成する必要があります。シンボルを使用すると、メモリ アドレスを関数名に一致させることができます。これを行うには、シンボルのローカル キャッシュを格納するローカル フォルダーをマシンに作成する必要があります (例: C:\symbols)。次に、シンボル サーバー パスを指定する必要があります。これを行うには、[ファイル] > [シンボル ファイルのパス] に移動して、次のように入力します。

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

シンボルを正しく構成する方法の詳細については、こちらを参照してください。

Symbols サーバーを適切に構成したら、[ファイル] > [クラッシュ ダンプを開く] からミニダンプを開くことができます。

ミニダンプを開くと、コマンド ラインの左側に、ダンプが生成されたときに実行されていたスレッドが表示されます。このスレッドが何を実行していたかを確認するには、次のように入力します。

kpn 200

最初に必要なパブリック Microsoft 関連シンボルをダウンロードする必要があるため、最初に実行するときは時間がかかる場合があります。すべてのシンボルがダウンロードされると、次のようになります。

01 MODULE!CLASS.FUNCTIONNAME1(...)
02 MODULE!CLASS.FUNCTIONNAME2(...)
03 MODULE!CLASS.FUNCTIONNAME3(...)
04 MODULE!CLASS.FUNCTIONNAME4(...)

どこ:

  • THE FIRST NUMBER : フレーム番号を示します
  • MODULE : コードを含む DLL
  • CLASS : (C++ コードのみ) コードを含むクラスを表示します
  • FUNCTIONAME : 呼び出されたメソッド。正しいシンボルがある場合は、パラメーターも表示されます。

次のようなものも表示される場合があります

01 MODULE!+989823

これは、この DLL に適切なシンボルがないため、メソッド オフセットしか表示されないことを示しています。

では、コールスタックとは何ですか?

次のコードがあるとします。

void main()
{
  method1();
}

void method1()
{
  method2();
}

int method2()
{
  return 20/0;
}

このコードでは、method2 は基本的に例外をスローします。これは、0 で除算しようとしており、これによりプロセスがクラッシュするためです。これが発生したときにミニダンプを取得した場合、次のコールスタックが表示されます。

01 MYDLL!method2()
02 MYDLL!method1()
03 MYDLL!main()

このコールスタックから、「main」が「method1」を呼び出し、次に「method2」を呼び出して失敗したことをたどることができます。

あなたの場合、このコールスタックがあります(これは「kb」コマンドを実行した結果だと思います)

b69dd8f0 bfa1e255 016d2fc0 89efc000 00000040 nv4_disp+0x48b94
b69dd8f4 016d2fc0 89efc000 00000040 00000006 nv4_disp+0x49255
b69dd8f8 89efc000 00000040 00000006 bfa1dcc0 0x16d2fc0
b69dd8fc 00000000 00000006 bfa1dcc0 e1e71018 0x89efc000

最初の列は子フレーム ポインターを示し、2 番目の列は実行中のメソッドのリターン アドレスを示し、次の 3 つの列はメソッドに渡された最初の 3 つのパラメーターを示し、最後の部分は DLL 名 (nv4_disp) です。実行中のメソッドのオフセット (+0x48b94)。シンボルがないため、メソッド名を確認できません。NVIDIA がシンボルへのパブリック アクセスを提供しているとは思えないので、ここから多くの情報を取得できないと思います。

「kpn 200」を実行することをお勧めします。これにより、完全なコールスタックが表示され、このクラッシュの原因となったメソッドの起源を確認できる場合があります (それが Microsoft DLL である場合は、私が提供した手順に適切なシンボルが含まれているはずです)。

少なくとも NVIDIA のバグに関連していることはわかっています ;-) このドライバーの DLL を最新バージョンにアップグレードしてみてください。

WinDBG のデバッグについて詳しく知りたい場合は、次のリンクをお勧めします。

于 2008-09-16T22:49:30.493 に答える
3

スタック トレースの解釈に関する非常に優れたチュートリアルは、次の場所にあります。

http://www.codeproject.com/KB/debug/cdbntsd2.aspx

ただし、そのようなチュートリアルを使用しても、適切なシンボルが利用可能/ロードされていない場合、スタック ダンプを解釈することは非常に困難 (またはほぼ不可能) です。

于 2008-09-16T22:46:39.893 に答える
0

読み込もうとしているスタックの例を含めると役立つ場合があります。良いヒントは、スタックに表示されているすべてのモジュールに対して正しいデバッグシンボルがあることを確認することです。これには、OSのモジュールのシンボルが含まれ、Microsoftはシンボルサーバーを公開しています。

于 2008-09-16T22:27:04.010 に答える