2009-07-24 8 views

答えて

7

私は、デバッグヒープとSTLチェックとあまり慣れていないんだけど、私はLinux上でGCCのメモリの問題を持っているときに私は(のmalloc(3)から)MALLOC_CHECK_という環境変数を使用します。

最近

Linux libc(5.4.23以降)およびGNU libc(2.x)のバージョンには、環境変数で調整可能な malloc実装が含まれています。 MALLOC_CHECK_が設定されている場合、同じ引数を持つdouble(double)の呼び出しdouble()や1バイトのオーバラン(off-by)など、単純なエラーに対して寛容であるように設計された 一本のバグ)。しかし、すべて のようなエラーを防ぐことはできません。また、メモリリークが発生する可能性もあります。 MALLOC_CHECK_が0に設定されている場合、検出されたヒープの破損は暗黙のうちに無視されます。 を1に設定すると、診断がstderrに出力されます。 2に設定すると、すぐにabort()が と呼ばれます。これは、後で多くの場合、クラッシュが発生する可能性があり、問題の真の原因が追跡できないために便利です。

オーバラン/アンダーランが発生すると即座にバッファオーバーランをキャッチするのに役立つエレクトリックフェンスもあります。詳細については、libefence(3)を参照してください。

+0

これはまさにデバッグヒープがピーターをやっていることです、ありがとう!これらのチェックが新しい/削除のためにも行われているかどうか知っていますか? – rpg

+0

私の実装では(演算子の削除、少なくともfree()への呼び出しがあるようですので、double-freeをキャッチします)。電気フェンスは、オペレータnewによって割り当てられたメモリでバッファオーバーランを確実に捕捉します。 –

+0

glibc 2.10と2.11はバグであることに注意してください。MALLOC_CHECK_はハングしてマルチスレッドプログラムをクラッシュさせる可能性があります。 – ephemient

3

スタンダードライブラリのhttp://sourceforge.net/projects/stlport/にあるSTLportのバージョンには、以前は使用していたデバッグモードがあり、これはスコットマイヤーズによってEffective STLで推奨されています。しかし、私はこれを数年間使っていないので、現在の状態を保証することはできません。

GCC STLデバッグhereについてのスレッドもありますが、私は再び情報を保証できません。

+0

ありがとうNeil。私は本当に "標準" STLで構築されたサードパーティのライブラリを使用するため、STLを置き換えたくないです。 – rpg

+1

残念ながら、通常のライブラリと同じベンダーのライブラリ実装を使用する場合でも、STLコンテナの別のセットを使用してデバッグSTLのサポートを取得する必要があります。私はかなりあなたがデバッグバージョンを使用している場合、オブジェクトがレイアウトを変更しない場所には本当に "デバッグSTL"がないことを確信しています。ですから、IMHOでは、同じバージョンのライブラリと同じフラグを持つすべてのコンポーネントを再構築する必要があります。 –

+0

私が知る限り、MSVCはデフォルトでデバッグSTL機能を備えているので、STLを使用するライブラリのデバッグバージョンはデバッグ機能を使用します(明示的にオフにしなかったと仮定すると - lib互換性がなくなります)デフォルトのMSVCプロジェクトを使用)。 私は努力して再構築することができましたが、可能であれば古典的なSTLを使いたいと思っています。 – rpg

2

私はそれらを一度も使ったことはありませんが、glibcが動的に割り当てられたメモリのデバッグを行うためのいくつかの機能を持っていることはわかっています。関連するマニュアルエントリhttp://www.gnu.org/s/libc/manual/html_node/Memory-Allocation.html#Memory-Allocationがあります。 "Unconstrained Allocation"には、割り当て関数をフックするさまざまな方法に関する情報があり、 "Allocation Debugging"には、glibcの割り振りトレース機能の情報が含まれています。

個人的には、Valgrindが最も簡単な方法です。

+0

ええ、私はMinGWでそれを使うことはできません... – rpg

3

いくつかのヒープのデバッグを使用すると、任意の標準ライブラリーを含む前_GLIBCXX_DEBUGを定義することで有効にすることができますを探しているのは何

2

(でもMinGWの下)efence/DUMAで利用可能です。私はあなたが一貫して使用することができない場合、これに影響を与えるものがあるかどうかはわかりません。私のデフォルトのアドバイスは非常に慎重である。また、デバッグチェックが大きなパフォーマンスヒットになる可能性があると聞いてきました。デバッグビルドのために常に有効にするのは賢明ではないかもしれません。

関連する問題