MicrosoftでWindowsグラフィックスをデバッグする方法

私はMSに2年以上携わっていますが、今でもほとんどの時間をデバッガーで過ごしています(ほとんどがOutlookのみ)。

私は、 Windows Imaging Componentをイメージを操作するための新しいライブラリとして使用していましたが、今ではDXGIはハードウェアアクセラレーションインフラストラクチャです。 1つ目は完全にユーザーモードで、2つ目はカーネルとユーザーです。しかし、デバッグの一般的な経験は基本的に同じです。





バグを見つけて、どこで落ちても、常にリモート、つまりリモートデバッグを送信します。 そしてほとんど常に-すぐに、リマインダーなしで。 クラッシュについて報告した後、すぐにログインして見るのが最も自然なアクションです。

シンボルサーバーは、メインビルドのシンボルを取得します。 ソース管理から、ビルド番号別にソートの必要なバージョンを取得します。

数日間反応せず、車がアイドル状態の場合は、メモリダンプがいっぱいになります。



インストルメントされたビルドでは、再度、あなたが尋ねると、彼らは繰り返すことを試みます。 この意味で、自動テストは再び役立ちます-繰り返しがはるかに簡単になります。 驚くべきことに、これが必要になることはめったにありません。おそらく、デバッグなしでデバッグできるからです。



もちろん、Jediデバッガーのリモート。 ビジュアルスタジオを忘れてください。 Windowsには(少なくとも管理されていない部分に)2つのデバッガーがあります-cdbとwindbg、そのうちの1つはコーシャーです。



cdbは純粋にコンソールデバッガーです。 g、bp、読み取りレジスタ、メモリおよびスタックダンプ、ソートを表示する手段としてのsorsファイルの行番号と名前。

windbg-これに加えて、通常の単なる人間のビットを行うことができます。 コードを表示し、その中のブレークポイントを赤で表示します。監視ウィンドウと呼び出しスタックウィンドウもあります。 時計は気分が悪く、気分によって更新され、複雑な表現などを理解しません。 なぜそう なぜなら、すべての本物のジェダイにとって必要なわけではないからです。 とにかく、windbgの最も価値のある部分はコンソールです。そこはすべてクールです。



そして同時に非常に強力です。 可能なすべてのブレークポイントを配置します-dllをダウンロードし、ドライバーをダウンロードし、どこからでもアクセスします。 アンロードDLLにクロールし、シンボルをオーバーロードし、exeバージョンを表示します。 すべての機能を見つけるには、数年の忙しい授業が必要だと思います。 そして、はい、別の楽しいレッスンは、複数の人が1つのデバッグコンソールに接続されている場合の集合デバッグです。



人々は非常に低いレベルでデバッグする方法を知っています、彼らは目を瞬くことなくasmコードと裸のスタックトレースを見始めます。 私の前のリードには常に魔法の紙があり、それが呼び出されると、関数がスタックのipとespをスタックし、ローカル変数が置かれるebpに移動します。 魔法のアーティファクト、+ 2デバッグスキル。 そして、これは1回または2回以上必要でした。 以前は、nafigを送信し、デバッグビルドを送信し、それを使用して再現を行うように言うか、1週間、コードを変更し、printfを1,000回、100万回再起動することで企業に入社しましたが、これを使わずにデバッグできることがわかりました。



説明のために、私のお気に入りの話をします。

遠くまで落ちて、Vistaのリリースビルドで、リモートに与えた、スタックの真ん中で変数関数を見たいです。 この前に、デバッガーは巻き戻すことができません。 理由は明らかです-これはecxにありました。呼び出しは内部であり、次の関数が呼び出されたときにスタックにプッシュされたため、スタックフレームの途中にあり、デバッガーはそれを見つけることができません

リードはお気に入りのcdbを起動し、アーティファクトを取り出し、スタックダンプを調べ始めます。 近くにはさまざまな標識がありますが、そのようには見えません。 彼はもっと真面目にならなければならないと言い、呼び出しの場所でasmコードを見て、彼がこれをどのようにスタックにプッシュしたか見てみましょう。 関数の異常を印刷する必要があります。

関数名ごとに行タグ付きのコードを印刷するコンソールコマンドを取得します。 なんらかの理由で半分しか印刷されず、明らかに出力数の制限があります。 パラメータで苦しみ、助けにはならない。

厄介なことに、「これらの派手な新しいコマンドは忘れて、昔ながらの方法でやろう」と言っています。 この関数のコードのアドレスを取得し、次のsorsファイルの内容を確認し、そのアドレスを取得して、それらの間のむき出しの混乱をダンプします。 その中のプッシュと目的のコール、ハッピーエンドを見つけます。



つまり、関数の名前によって自動的に行でそれを無効にするコマンドは、新しい形式の異常ながらくたであるか、2つのアドレス間のダンプです。

VSデバッガーとは何ですか?



そしてまだ-デバッグを超えたWindowsのバグを見たことはありません。 数日間座っていると、別のチームの農民の助けが必要になります。バグは何度もバウンス(または一括デバッグ)されますが、それでも定期的にクラッシュすると(必ずしも一定の再現でなくても)ナデッツォです。



短い要約:



1)どこでも、常にリモートデバッグを実行できるようにする。 すべてのビルドのキャラクターベースを持っています。

2)低レベルを恐れないでください。

3)この環境に投資します。



そして、これらすべての理由のために-Windowsで家で何かが落ちたり遅くなると、法と法の冷静な考えが象徴になり始めます。

そしてデバッグ。




All Articles