2009-07-15 18 views
0

私は、Windows MFC 8.0アプリケーション(リリースビルド)でメモリリークを見つけようとしています。MFC 8.0アプリケーションでmallocsのスタックトレース全体にアクセスするにはどうすればよいですか?

によるVC8 CRT's malloc problem with FPOにWinDbgの(またはUMDH)を使用して、割り当ての完全なスタックトレースを表示するために失敗した後、私は(すなわちDbgHlp StackWalkでLeakDiagを使用して有効)のみLeakDiagがないことを実現するためのソリューションがhereを提案適用しようとしましたCランタイムアロケータを監視するときにはログファイルを生成しませんが、Windowsヒープアロケータを監視しても動作しますが、スタックトレースはmalloc呼び出しで終了します。

生成されたファイルに関数名、ファイル名、行などが表示されているため、記号が正しく構成されています。

なぜ私はランタイムアロケータをログに記録できないのですか?私がDbgHlp StackWalk APIを使用していてもなぜ完全なスタックトレースを取得できないのでしょうか?

ご提供いただけるご意見をお待ちしております。

追加情報:私のスタックトレースがどのように見えるか

:私はWinDbgのを使用して、これを持って

。アドレスは!heap -lによってリークされたブロックとして報告されるアドレスです。

0:000> !heap -p -a 25b18400 
address 25b18400 found in 
_HEAP @ 2a70000 
    HEAP_ENTRY Size Prev Flags UserPtr UserSize - state 
    25b183f8 0008 0000 [07] 25b18400 00021 - (busy) 
    Trace: 00a4 
    7c97d6dc ntdll!RtlDebugAllocateHeap+0x000000e1 
    7c959d18 ntdll!RtlAllocateHeapSlowly+0x00000044 
    7c92b298 ntdll!RtlAllocateHeap+0x00000e64 
    78134d83 MSVCR80!malloc+0x0000007a 

答えて

1

サードパーティのツールを使用しない理由は何ですか?

I.e.インテル並行インスペクタの評価版をダウンロードしてください。既存のリリースビルドに対してインストールと実行が非常に簡単です。そして、それは、ほとんどの場合、完全なスタックを示しています(私はかなり確信していますが、いくつかの誤検出もあります)。

コンフィギュレーションマネージャからリリースバージョンを選択し、(リンカオプションで)pdbファイルを作成していることを確認します。次に、「Inspect Memory errors」を開始します。

他にも多くのツールが存在します:AQTime、GlowCode。これらのすべては、再コンパイルや計測を必要としません。

+0

私はすでにIntel Parallel Studioを試していますが、ただハングアップしています...かなり重いので、私のアプリケーションです... それ以外では、私が探しているメモリリークは、開発者用ツールが不足しているコンピュータ私はコンパイラをインストールすることができましたが、私の開発マシンでIPSが起動しない場合はどうしても気になりませんでした... あなたが言及している他のツールを見ていきます。 ありがとうございました! –

+0

パラレルスタジオの最後のバージョンははるかに頑丈に見えます - ベータ版ではありませんでした。しかし、少なくともコンパイラなしでGlowCodeを使用することはできます。私の知る限り、pdbファイルだけが必要です。私は最近それを評価しました。それはリアルタイムで動作するいくつかの内部エラーを与えたが、私はいくつかの結果を得た。 –

+0

GlowCodeは素晴らしいアプリケータとメモリチェッカのようですが、週末にアプリケーションをプロファイリングするのに深刻な問題がありました。とにかく、私はまだメモリリークを見つけることができませんでしたが、それは有用で非常に高速であることが証明されています...しかし、それは私のMFC 8.0アプリケーションの完全なスタックトレースを与えることができたので、 。 ありがとうございます! –

1

私はCランタイムアロケータをログに記録することができない理由を誰もが知っていますか?

あなたはDebugビルドを使用していますか?デバッグCRTには、グローバルOSヒープ上で動作するUMDHやその他のツールを破る独自のヒープチェック機能があります。 UMDHとフレンドを使用している場合は、オフのがMFCとMSVCRTのヒープデバッグ機能のすべてであることを確認してください。

おそらくまた、またはそれ以外の場合は0

のデフォルトからあなたの過程で何か、changed the small-block allocator threshold、8.0リリースCRTべきちょうど前方にあなたは、ヒープのデバッグツールの欲しいものであるグローバルヒープに要求します。

なぜ私はDbgHlp StackWalk APIを使用していても完全なスタックトレースを取得できないのですか?

私はSkywingがあなたが与えたリンクの詳細をきちんと説明したと思います。何度か反復するだけで、おそらく少しは「x86版」と言われていた部分は、「完全な」スタックトレースは一般的に不可能です。デバッグシンボルの外にある特定の機能にメタデータが付いていないためです過ぎ去ってください。 " DbgHlpがEBPをスクラッチレジスタとして使用して(MSVCRTのmallocのような)関数を過ぎ去らせるのは全く実用的ではありません。

もちろん、修正されたソースから独自のCRTライブラリを再構築することも、CRT malloc/freeを置き換えることもできます。

実際には、スタックアンワインディングが非常に信頼性が高いことが保証されているx64プラットフォームでリークを再現することが最善の方法だと思います。

関連する問題