4

非常に一般的: アクセス違反が発生したときに、コードのどの行が最後にメモリのブロックを解放したかを知る簡単な方法はありますか?

あまり一般的ではありません: プロファイラーについての私の理解は、プロファイラーが割り当てと割り当て解除のプロセスをオーバーライドするということです。これが当てはまる場合、メモリのセクションを最後に解放したコード行を格納して、後でアクセス違反が原因でクラッシュしたときに、何が最後に解放したかがわかるようにすることができますか?

詳細: Windows、ANSI C、VisualStudioを使用

4

3 に答える 3

7

はい!

Windowsデバッグツールをインストールし、ApplicationVerifierを使用します。

  1. [ファイル]->[アプリケーションの追加]で、.exeを選択します
  2. [基本]で、[メモリとヒープ]を選択します。
  3. ntsd(ntsd yourprogram.exe)でプログラムのデバッグビルドを実行します。
  4. バグを再現します。

これで、クラッシュを発生させると、AppVerifierからデバッガーに追加情報が表示されます。!avrfを使用すると(実行に長い時間がかかる場合があります(分))、可能な限り多くの有用な情報を提供しようとします。

すべてのメモリアドレスでdpsコマンドを使用して、保存されているすべてのスタック情報(割り当て、割り当て解除など)を取得できます。

メモリアドレスで!heapコマンドを使用することもできます。

0:004> !heap -p -a 0x0C46CFE0

これも情報をダンプします。

参考文献:

于 2009-03-27T23:34:32.500 に答える
0

簡単な答え:いいえ。

必要なのはデバッグmallocです。私はもうWindowsについていけませんが、この無料のものを含めて、いくつかあります。

アップデート

VisualStudioCにはバージョンが組み込まれているようです。こちらをご覧ください

アプリケーションがCランタイムライブラリのデバッグバージョンとリンクされている場合、mallocはに解決され _malloc_dbgます。デバッグプロセス中にヒープがどのように管理されるかについての詳細は、CRTデバッグヒープを参照してください。

...そしてここで_malloc_dbgを参照してください。

于 2009-03-27T23:32:57.403 に答える
-1

いいえ、この情報を保存するために独自のアロケータを提供しない限り(たとえば、new / deleteをオーバーロードすることによって)、そうではありません。

プロファイラーが行うことは、プロファイリングする内容に大きく依存します。私はあなたが探しているものを追跡するプロファイラーを知りません。

おそらく、あなたがあなたの状況についてより多くの詳細を提供した場合、人々はあなたが直面している問題を診断するための代替手段を提案することができます。

于 2009-03-27T23:28:39.893 に答える