最初に既存の回答を探したところ、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 ツールはありますか?