私の作業中、私は定期的にかなり一般的なプログラミングエラーに直面しています。すでに解放されているオブジェクトを使用しています。これにより、C++でUBが呼び出されます。 linuxでは、この種の問題は通常、ValgrindツールのMemcheckを使用して解決されます。から Memcheck manual :
Memcheckは、不正なアドレスが関連している可能性のあるものを確立しようとします。したがって、すでに解放されているメモリのブロックをポイントしている場合は、そのことが通知され、ブロックが解放された場所も通知されます。
Memcheckは、オブジェクトが割り当て解除されたコールスタックを提供してくれます。問題をデバッグすることができます。 windowsに同じ機能を持つ、できれば無料の同様のツールはありますか?
メモリ博士のドキュメントによると、-delay_frees_stack
オプションとまったく同じValgrind機能。 Option Reference から:
-delay_frees_stack
default: false
Record callstacks on free to use when reporting use-after-free or other errors that overlap with freed objects. There is a slight performance hit incurred by this feature for malloc-intensive applications.
また、ここにメモリ博士によって報告された エラーの例があります :
Here is another example, using the -delay_frees_stack option to obtain the callstack of the freed memory:
Error #8: UNADDRESSABLE ACCESS: reading 0x001338a8-0x001338ac 4 byte(s)
# 0 unaddr_test1 [e:\derek\drmemory\git\src\tests\suppress.c:110]
# 1 test [e:\derek\drmemory\git\src\tests\suppress.c:269]
# 2 main [e:\derek\drmemory\git\src\tests\suppress.c:297]
Note: @0:00:02.141 in thread 3024
Note: next higher malloc: 0x001338e8-0x00133938
Note: prev lower malloc: 0x001337e8-0x00133820
Note: 0x001338a8-0x001338ac overlaps memory 0x001338a8-0x001338c4 that was freed here:
Note: # 0 test [e:\derek\drmemory\git\src\tests\suppress.c:269]
Note: # 1 main [e:\derek\drmemory\git\src\tests\suppress.c:297]
Note: instruction: mov (%eax) -> %eax
Lailin Chenが this 質問への回答で指摘したように、次のいずれかを試してください。
メモリ博士: https://github.com/dynamorio/drmemory
UMDH: http://support.Microsoft.com/kb/26834
AppVerifier: http://msdn.Microsoft.com/en-us/library/dd371695%28v=vs.85%29.aspx
私のために働いた方法 は、グローバルオペレーターに「新規」および「削除」を提供するカスタムメモリマネージャーを記述し、VirtualProtectですべての解放/使用済みメモリブロックをロックすることでした。このように、解放されたメモリを使用しようとすると、すぐにアクセス違反がトリガーされ、キャッチしてデバッグできます。ただし、これを行うには、VirtualAlloc
のようなものを使用して、使用可能なすべてのメモリ(またはその3/4)を「取得」する必要があり、(この最初に割り当てられたブロックから)返すすべてのメモリブロックはPAGE_SIZE
である必要があります整列(GetSystemInfo
のドキュメントを参照)。そうしないと、確実にロックすることができません。つまり、些細なアプリケーションでも、この方法を使用するには大量のメモリが必要になる場合があります。
「Windows用のvalgrindの代替案」については-聞いたことがない。誰かがcygwinでvalgrindをコンパイル/使用できる可能性があると投稿しましたが、これが本当かどうかはわかりません。
ここに勇敢なValgringの試みがあります。
http://sourceforge.net/p/valgrind4win/wiki/Home/
ただし、適切な「Valgrind for Windows」を実装するには、Windowsソースコードへのアクセスが必要です。
IOW:豚が飛ぶとき。
私にとって最も効果的だったのは、 Visual Leak Detector を使用することでした。
#include <vld.h>
テストしたい実行可能ファイルの冒頭で。次に、ウィンドウ内からデバッグ実行可能ファイルを実行すると、リークされたすべてのメモリに関する詳細情報が提供されます。出力から、メモリが割り当てられた行に直接アクセスできるので、注意することができます