クラッシュ ダンプから GDI/ユーザー リソースの使用状況を確認する

StackOverflow https://stackoverflow.com/questions/104122

  •  01-07-2019
  •  | 
  •  

質問

GDI をリークしていると思われるアプリケーションのクラッシュ ダンプがあります。アプリは XP で実行されており、WinDbg にロードして確認することは問題ありません。以前は、 Gdikdx.dll 拡張子 Gdi 情報を確認するには、この拡張機能は XP または Vista ではサポートされていません。

WinDbg で GDI オブジェクトの使用法を見つけるためのヒントを持っている人はいますか。

あるいは、XP および Vista (または Windows 2000 ですが、これは対象ではありません) 用の「ライブ」デバッグ ツールをご存知であれば、失敗したプログラム (およびそのストレス テスト スイート) にアクセスできるので、実行中のシステムで再現することもできます。 。

役に立ちましたか?

解決

ありました 数年前の MSDN マガジンの記事 GDI リークについて話しました。これは、有益な情報が得られるいくつかの異なる場所を示しています。

WinDbg では、次のことも試すことができます。 !poolused いくつかの情報を得るためにコマンドを実行します。

クラッシュ ダンプからリソース リークを見つけるのは (事後分析で) 難しい場合があります。メモリ リークが常に同じ場所で、同じ変数を使用していれば、運が良ければ、リークが最後に発生した場所を確認できるでしょう。漏洩するなどデバッガで実行中のプログラムを実行すると、おそらくはるかに簡単になるでしょう。

使ってみることもできます マイクロソフトの迂回路, しかし、ライセンスは常にうまくいくとは限りません。また、もう少し侵襲的で高度なものでもあります。

他のヒント

私は先週、GDI リークファインダーツールの開発に費やしました。また、定期的なストレス テストも実施していますが、ユーザー/GDI オブジェクト ハンドルの過剰消費が原因で停止することなくテストが 1 日以上続くことはありませんでした。

私の知る限り、私の試みはかなり成功しています。もちろん、私は事前に時間をかけて代替のより迅速な解決策を探しました。言及する価値がありますが、私は以前、上記の msdn 記事の GDILeaks ツールを使用して、半ば幸運な経験をしました。言うまでもなく、それを機能させる前にいくつかの問題を解決する必要がありましたが、今回は私が望んでいたものと方法を与えてくれませんでした。彼らのアプローチの欠点は、デバッガ インターフェイスが重いことです (調査対象の速度が桁違いに遅くなり、これは私にとって許容できないことだと思いました)。もう 1 つの欠点は、常に機能するわけではないことです。一部の実行では、何もレポート/計算できませんでした。その複雑さ (コードの量から判断すると) も怖がらせる要因でした。私は GUI の大ファンではありません。ウィンドウがまったくない方が生産性が高いと信じているからです ;o)。また、シンボルを見つけて使用させるのも難しいと感じました。

私が独自のツールを書き始める前に使用したもう 1 つのツールは、 リークブラウザ.

とにかく、私は最終的に次の目標を達成するための反復的なアプローチに落ち着きました。

  • パフォーマンス上の軽微なペナルティ
  • 実装の簡素化
  • 非侵襲性(複数の製品に使用)
  • 可能な限り利用可能なものに頼る

コア機能(注入可能な DLL です)には迂回(非営利使用)を使用しました。自動コード生成に Javascript を使用します (15K のスクリプトから 100K のソース コードを生成します。これを手動でコーディングすることはできませんし、C プリプロセッサも必要ありません!) 加えて、データ分析とスナップショット/差分のサポートのための Windbg 拡張機能を追加します。

長い話を手短に言うと、作業が終了した後、別のストレス テストで情報を収集するのに数時間、リークの分析と修正にさらに 1 時間かかりました。

私の発見を喜んで共有させていただきます。

追伸以前の作品を改善するために少し時間を費やしました。私の意図は、誤検知を最小限に抑えることでした (開発中に誤検知が多すぎました)。そのため、割り当て/解放の一貫性もチェックし、決してリークされない割り当てを考慮することも避けます。

編集:ツールを探す ここ

そのための Windbg スクリプトを作成しました。の答えを見てください

クラッシュ ダンプから GDI ハンドル数を取得するコマンド

割り当てスタックを追跡するには、最後に割り当てられた GDICell オブジェクトの後に ba (Break on Access) ブレークポイントを設定し、別の GDI 割り当てが発生した時点でブレークすることができます。アドレスが変更されるため、少し複雑になる可能性がありますが、ほとんどのリークを見つけるには十分です。

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