2017-06-13 2 views
1

valgrindを使用しないと、大きなメモリ(たとえばmalloc)が割り当てられている場所を見つける方法はありますか?大きなメモリ割り当てのためにgdbブレークポイントを設定することは可能ですか?C++で大きなメモリ割り当てを見つける

いくつかの依存ライブラリはvalgrindのの使用を禁じているので、私は共有ライブラリインターポーザはうまく仕事をする(それはその特別なスタックを認識しないようvalgrindのクラッシュします)、valgrindの

+0

[トラックC++メモリ割り当て](https://stackoverflow.com/questions/910172/track-c-memory-allocations)の可能な複製 –

+0

私が言ったように、私たちはvalgrind大衆の使用を禁じます。 –

+3

メモリ割り当てを追跡するもう1つの方法は、new演算子を実装し、そのメソッドからmallocを呼び出すことです。これは、メモリの割り当てと解放を追跡するために行うことです。そのクラスは、新しい演算子を使用してメモリを割り当てることを計画するたびに、その新しい演算子を呼び出すように、クラスの基本クラスにする必要があります。 – Asesh

答えて

0

を使用することはできません。 Hereは、必要なものの完璧な例を示す優れた記事です。

関数が共有ライブラリにある場合、実行時リンカーは代わりに別の '介在'関数を呼び出すように指示できます。インターポーザは、機能を完全に置き換えることも、機能を拡張することもできます。大きな例は、関数のmallocファミリです。あなたのケースでは、インターポーザーがmallocサイズをチェックし、特別な処置をとることができます。 gdbを使用してインターポーズライブラリ自体にブレークポイントを配置することができます。そのため、特殊ロジックにブレークポイントを設定して要件を満たすことができます。

インターポーザーは共有(.so)ライブラリでのみ動作します。静的ライブラリ(.a)は実行可能ファイルに直接リンクし、呼び出しを簡単に傍受することはできません。 mallocファミリは通常、Linuxのシャードライブラリからリンクされているので、これはあなたのケースでは問題ではありません。

Linuxのすべての主要な味は、LD_PRELOAD機能を使用するインターポーザーをサポートしています。