質問

Windbgファンは、それが非常に強力であると主張し、私は同意する傾向があります。しかし、STLコンテナのデバッグに関しては、常に行き詰っています。変数がスタック上にある場合、!stl拡張機能がそれを把握することがありますが、複雑なタイプ(たとえばstd::vector<TemplateField, std::allocator<TemplateField> >)のコンテナーがヒープまたは他の構造の一部にある場合、その方法がわかりませんその内容を表示します。

ヒント、ポインタを評価してください。

役に立ちましたか?

解決

このデバッガー拡張機能を試してみることもできます。 Skywing によって開発されたSDbgExtというライブラリです。

他のヒント

多くの場合、STLデータ型に対するデバッガーのサポートが不十分であることがわかりました。このため、ロギングフレームワークとロギングステートメントをますます使用しています。これらはデバッガを使用できない人向けであると思っていましたが、今では本当の価値を提供していることに気付きました。これらを使用すると、コードに移植可能なデバッグの知識を埋め込み、コードとともに維持することができます。対照的に、デバッガで行う作業は通常一時的なものです。

WinDbgのPython拡張機能(pykd)にはスニペット stlp.py はマップの内容をダンプできます。
現在、STLPortマップの実装をサポートしています。 x86およびx64でテスト済み。 この記事は、その使用方法を示しています(ロシア語、しかし、例は自明です。)

先ほどまったく同じ質問がありました。私の答えは、Visual StudioはSTLや複雑な型に対して本当に優れたデバッガーであるということです(Visual StudioがMDbgよりも優れた単なるデバッガーであるように)。

これは、WinDBGがそれほど強力ではないということではなく、単に低いレベルであるということです(たとえば、Visual Studioを使用してクラッシュダンプで何か便利なことを試してください-できません)。

とにかく、質問に答えるには、Visual Studioを使用して、いくつかのトリックを使用してデータ型を調べることができます。

  1. WinDBGの別のインスタンスを起動し、非侵襲的に接続します:cdb -p <PID> -pv。これにより、デバッグ対象のスレッドが中断されます。これで、元のWinDBG qd
  2. を安全にデタッチできます。
  3. Visual Studioをアタッチし、非侵襲的なWinDBG <=>をデタッチします。 STLを見て、必要に応じて続行します。
  4. WinDBGに戻る必要がある場合は、ステップ1に進み、侵襲的なWinDBGと交換します。

通常、多くのクラスでtoString()メソッドを使用します。これは、私が重要だと思うすべての情報を表示します。その後、コンテナはこれを呼び出して、コンソールにクラス情報を表示できます

dt -rを使用 つまり、dt yourapp!class 7ffdf000 -r5

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top