3

バックグラウンド

(_CRT_DEBUG_MALLOCとMFCおよびCRTのリーク検出から)メモリリークの問題を追跡しようとしていますが、この行は頻繁に呼び出されるため、どの呼び出しかわかりません実際にリークします。また、Allocation-Number +__p__crtBreakAlloc()は、実行ごとに異なる割り当て番号であるため、役に立ちません。

とにかく、これまでのところ背景について。別のツールを使用する必要があると思われる場合は、コメントを残してください。リーク自体よりもはるかに興味深いと思うので、答えが私の根本的な問題ではなく実際の質問に集中することを感謝します(最終的には十分な突っ込みを通してそれを見つけるでしょう)。

質問

WinDbg(VSにはないと確信しています)で、次のプロパティを持つブレークポイントを持つことは可能ですか?

  • 壊れません。(つまり、「トレースポイント」です)
  • ヒットすると、コールスタックを記録します(特定の深さまで)
  • また、いくつかのグローバル状態(変数、おそらくメモリアドレスの生の値)を記録する必要があります

これは可能ですか?どのように?

4

3 に答える 3

1

それぞれの質問に答えるには:

  • ブレークせずにブレークポイント:

    bp myDll!<namespace>::myClass::myFunc "gc"-二重引用符で区切られたコマンドを実行できます。この場合、ブレークポイントに到達したら、続行します。

  • ブレークポイントに到達すると、コールスタックを特定の深さまでダンプします

    .kframes 0n50; bp myDll!<namespace>::myClass::myFunc "kb;gc"-これにより、呼び出しスタックの長さが50(デフォルトは20)に設定され、0n10進数ベースであることが示されます。後に二重引用符で囲まれたコマンドはbp、呼び出しスタックをダンプしてから続行します

  • グローバルな状態を記録する

    dt myVar-グローバル変数を表示します。さらに、d* myVar

    dd myGlobalVar

    pdbにプライベートシンボルが削除されていないことを確認してください-Unicode文字列、深さなどを処理する特定のスイッチがあるため、情報を確認する必要があります。さらに、WinDbgdtのウォッチウィンドウで値を簡単に確認できます。d*

さらに、WinDbgには自動リーク検出コマンドがあります。

!heap -l

しかし、私はそれが少しヒットして時々逃すのを見つけました、ここでより多くの情報

于 2013-02-16T23:16:09.487 に答える
1

あなたが試みているのは、メモリリークを処理するときにほとんどプラスの効果がない本当にブルートフォースのアプローチです-スタックトレースに基づいてリークを追跡する複雑さに対処するには、少なくともUMDHのようなものが必要です。いくつかのトレースを取得することに成功したとしても、手動で処理するには過度に冗長になる可能性があります。

あらゆる種類のリークを追跡するための汎用デバッガー拡張機能があります。これにより、手動ルートを使用する場合に少し活用できます。domdbg拡張機能

私が書いたヘルパーPythonスクリプトがあります。UMDHパスを使用すると便利です。スナップショットの作成を少し自動化するのに役立ち、シンボル情報をキャッシュしてトレースをバイナリ形式で保存するため、トレースの分析をより効率的に行うことができます( UMDHで使用されるテキスト表現とは対照的に):pyumdh

于 2013-02-18T09:15:31.360 に答える
1

任意の開閉操作を追跡できるトレーサー拡張機能もあります。

于 2014-02-04T14:30:03.140 に答える