発表したばかりのヒープトラック ユーティリティを宣伝したいと思います。詳細については、http://milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linux をご覧ください。
私は libunwind とその後の libbacktrace を使用して、DWARF デバッグ情報でバックトレースの注釈を遅らせるため、heapwatch ツールと比較して、パフォーマンスははるかに優れているはずです。
もっとフィードバックが欲しいので、試してみてください!
memleax がうまくいくはずです。
プログラムを再コンパイルしたり、ターゲット プロセスを再起動したりすることなく、実行中のプロセスのメモリ リークをアタッチしてデバッグします。非常に便利で、本番環境に適しています。
これは malloc/free() 呼び出しに対してのみトラップするため、Vagrild よりもパフォーマンスへの影響が少ないはずです。
GNU/Linux-x86_64 および FreeBSD-amd64 で動作します。
注:私は著者です。どんな提案も歓迎します
GNU libc には組み込みの malloc デバッグがあります:
http://www.gnu.org/software/libc/manual/html_node/Allocation-Debugging.html
LD_PRELOAD を使用して mtrace()
を呼び出します 自分の .so から:
#include <mcheck.h>
static void prepare(void) __attribute__((constructor));
static void prepare(void)
{
mtrace();
}
コンパイル:
gcc -shared -fPIC dbg.c -o dbg.so
次で実行します:
export MALLOC_TRACE=out.txt
LD_PRELOAD=./dbg.so ./my-leaky-program
後で出力ファイルを調べます:
mtrace ./my-leaky-program out.txt
そして、次のようなものが得られます:
Memory not freed:
-----------------
Address Size Caller
0x0000000001bda460 0x96 at /tmp/test/src/test.c:7
もちろん、スタック全体をダンプする独自の malloc フックを自由に作成してください (役立つと思われる場合は backtrace() を呼び出します)。
バイナリのデバッグ情報をどこかに保持していれば、行番号や関数名を取得できます (たとえば、バイナリにデバッグ情報が組み込まれている、または objcopy --only-keep-debug my-leaky-program my-leaky-program.debug
を実行した場合など)。 ).
また、Boehm の GC を試すこともできます。これは漏れ検出器としても機能します:
http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html