TCL_MEM_DEBUG - Tclメモリデバッグを可能にするためのコンパイル時のフラグ。
TclがコンパイルされるときにTCL_MEM_DEBUGを定義しておくことでメモリデバッグをする強力な補助セットは、コンパイルされたバイナリに生成されます。これはメモリ漏洩、メモリ割り当てオーバーラン、及び他のメモリ関連のエラーをデバッグすることを支援するC言語、及びTclファンクションを含みます。
メモリデバッグを可能にするためにTCL_MEM_DEBUGを定義したあとに、Tclを最初から再コンパイルしなければなりません。この定義で
MomoryコマンドをTclに加えるため 非スタブバージョンTcl_InitMemoryにおいてコンパイルします。
TCL_MEM_DEBUGは連結されようとしている全てのモジュールで定義するか、もしくは全てのモジュールで定義しないかで統一しておかなければなりません。
そうしないと(統一定義されなかった場合)TclDbCkfreeとTcl_DbCkalloc、またはTcl_CkallocとTcl_Ckfreeの非定義リンクエラーが発生するからです。
いったんメモリデバッグサポートがTclにコンパイルされたらC言語のファンクション
Tcl_ValidateAllMemory、Tcl_DumpActiveMemory及びTclのMemoryコマンドはメモリの使用が有効かどうかを調査するために使えるようになります。
メモリデバッグが有効に定義されれば ckallocへのコールが行われるたびに、メモリデバッグコードで割り当てられたメモリを追跡するために、常に要求されたメモリより僅かですが、多目に割り当ててられます。そして、8バイトの「ガードゾーン」は割り当てられたスペースの前後に追加されて、コール側に返されます。(
ガードゾーンのサイズは、ファイルfile generic/tclCkalloc.cにおけるC
#define LOW_GUARD_SIZE、及び#define HIGH_GUARD_SIZEによって定義されます。もっと大きいオーバーライトに不安なら、パフォーマンスにおいていくらかの代償を払いますが、さらに大きく拡張できます
) 。ガードゾーンには既知のパターンが書いておきます。 ckfreeへのコールが発生する際に解放されたメモリのガードゾーンの何れかが、何か修正されたかどうかを分析してエラーチェックします。どれか1つが修正されたら該当ガードバイト及びそれらの新しい内容は確認され、そして「Lowガード失敗」か「Hいghガード失敗」メッセージは出力されます。「ガード失敗」(guard
failed)メッセージにはメモリパケット及びファイル名のアドレスckfreeをコールしたコードのライン番号を含みます。これによって一般
的な一度限りの問題を検出することが可能となります。例えば書かれるデータのために十分なスペースは割り当ててられなかった場合です。
通常の場合はメモリデバッグ有効状態でコンパイルされたTclは、クラッシュ問題を見つけることを容易にできます。メモリ命令によりメモリ妥当性検査をオンにすることは、より難しい問題を見つけることに役立ちます。Tclインタープリタによるコマンドの実行が十分に深く進む前にクラッシュが発生していると疑う場合、MEM_VALIDATEを定義した状態でtclCkalloc.cを再コンパイルし、そしてTclをリビュールトします。これで初めてckallocをコールする時点からメモリ妥当性検査を可能にできます。これは当然
、大きいパフォーマンス低減を引き起こします。
もし絶望的な状態でckalloc、及び ckfreeへの全てのコールで妥当性検査をオンにしても十分でないなら、直接
Tcl_ValidateAllMemoryを明白に任意のポイントでコールすることができます。通
常引数は char * と intでファイル名、及び呼び出し側のライン番号ですが、それらは実際に必要とする何にでもなりえます。問題を発見した後で忘れずにコールを取り除きましょう。
参照
ckalloc, Memory, Tcl_ValidateAllMemory,
Tcl_DumpActiveMemory
memory, debug
Copyright © 1992-1999 Karl Lehenbauer and Mark Diekhans.
Copyright © 2000 by Scriptics Corporation.
Copyright © 1995-1997 Roger E. Critchlow Jr.
|