22

最初に既存の回答を探したところ、Valgrindが Linux でのメモリ リーク デバッグ用のツールとして人気があることがわかりました。残念ながら、Valgrindは私の目的には適していないようです。その理由を説明しようと思います。

制約:

  • リークはお客様の環境でのみ再現します。特定の法的制限により、既存のバイナリを使用する必要があります。再構築はありません。
  • 通常の環境では、アプリケーションは最大 10% の CPU を消費します。たとえば、最大 10 倍の CPU 使用率の増加に耐えることができます。デフォルトの memcheck設定のValgrind はさらに悪化し、アプリケーションが長時間応答しなくなります。

私が必要としているのは、Microsoft のUMDHに相当するものです。ヒープ割り当てごとにスタック トレースをオンにし、特定の時点で、スタックでグループ化され、割り当てカウントで降順で並べ替えられたすべての割り当てをダンプします。私たちのアプリは Windows と Linux の両方のプラットフォームで出荷されているため、UMDHでの Windows のパフォーマンスはまだ許容範囲内であることはわかっています。

ここに私が検討したツール/方法があります

  • Valgrind-memcheckおよび-massifツールは、必要以上のことを行います (すべての割り当てポインターのプロセス メモリ全体をスキャンするなど
    ) 。 、そのため、出力を解析するいくつかのスクリプトを作成する必要があります
  • dmallocライブラリ (dmalloc.com) には新しいバイナリが必要です
  • LeakTracer ( http://www.andreasen.org/LeakTracer/ ) C++ の new/delete ( malloc/freeも必要) でのみ動作し、group-by-stack および sort 機能はありません
  • LD_PRELOAD メカニズムを使用して .so ライブラリとしてツールを自分で実装する (LD_PRELOAD メカニズムを使用して 'malloc' をオーバーライドする) 私の Linux 用コーディング スキルを考えると、少なくとも 1 週間はかかり、自転車を発明するような気分になります。

何か見逃しましたか?軽量のValgrindオプションまたは既存の LD_PRELOAD ツールはありますか?

4

8 に答える 8

17

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

于 2013-08-27T02:03:06.347 に答える
5

発表したばかりのヒープトラック ユーティリティを宣伝したいと思います。詳細については、http : //milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linuxをご覧ください。

libunwind とその後の libbacktrace を使用して、DWARF デバッグ情報でバックトレースの注釈を遅らせるため、heapwatch ツールと比較して、パフォーマンスははるかに優れているはずです。

フィードバックをもっともらいたいので、ぜひ試してみてください。

于 2014-12-03T10:38:45.613 に答える
5

memleaxはあなたのために働くはずです。

プログラムを再コンパイルしたり、ターゲット プロセスを再起動したりすることなく、実行中のプロセスのメモリ リークをアタッチしてデバッグします。非常に便利で、本番環境に適しています。

これは malloc/free() 呼び出しに対してのみトラップするため、Vagrild よりもパフォーマンスへの影響が少ないはずです。

GNU/Linux-x86_64 および FreeBSD-amd64 で動作します。

注:私は著者です。どんな提案も歓迎します

于 2016-12-09T02:03:32.113 に答える
1

驚いたことに、Microsoft の UMDH のようなものをオープン ソース ドメインで見つけたり、すぐにダウンロードできるものを見つけることができませんでした。( Google Heap Leak Checkerも調べましたが、UMDH というよりは Valgrind に似ています)。そのため、 malloc インストルメンテーションプロジェクトを参照点として使用して、自分でツールを作成することになりました。

https://github.com/glagolig/heapwatch

このツールには多くの制限がありますが、私の目的には問題なく機能しました。

于 2013-09-21T21:53:21.250 に答える
1

@グラゴリグ、

はい、MemoryScape はスタックの場所ごとに割り当てをグループ化できます。

評価版は入手できましたか?ボットとは思えないメール アドレスを使用していたと仮定すると、すぐに返信が来るはずです。そうでない場合、または技術的な問題がある場合は、私に連絡するか、技術サポート チームに連絡してください。

クリス・ゴットブラス

Rogue Wave Software の TotalView プリンシパル プロダクト マネージャー

電子メール: ファーストネーム。姓 (で) roguewave . コム

于 2013-08-29T20:48:32.377 に答える