## Tcl8.6.17/Tk8.6.17 Documentation > Tcl C API > TCL_MEM_DEBUG

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

### NAME

TCL_MEM_DEBUG — Tcl 記憶域不具合修正を可能にする機械語翻訳時の旗印　 Compile-time flag to enable Tcl memory debugging

### 説明 DESCRIPTION

TCL_MEM_DEBUG を定義して Tcl が言語翻訳された時､強力な記憶域修復補助機能が翻訳された２進数に含まれる｡これは C と Tcl の函数を含み､記憶域漏洩､記憶域重複割付､他の記憶域に関連する不都合の不具合修復の補助をする｡ When Tcl is compiled with TCL_MEM_DEBUG defined, a powerful set of memory debugging aids is included in the compiled binary. This includes C and Tcl functions which can aid with debugging memory leaks, memory allocation overruns, and other memory related errors.

### ENABLING MEMORY DEBUGGING

記憶域の修復を可能にする為に､ Tcl は TCL_MEM_DEBUG を定義して最初から言語翻訳を再度行うべきである(譬えば､翻訳する時､ the --enable-symbols=mem 旗印を configure 記述譜に伝える)｡これは Tcl に memory 命令を加えるために stub 機構を使わない版の Tcl_InitMemory をも翻訳する｡ To enable memory debugging, Tcl should be recompiled from scratch with TCL_MEM_DEBUG defined (e.g. by passing the --enable-symbols=mem flag to the configure script when building). This will also compile in a non-stub version of Tcl_InitMemory to add the memory command to Tcl.

TCL_MEM_DEBUG は全ての機能について定義されるように放置されるか､一緒に連結されようとする全ての機能に就いて未定義にするかのどちらかでなければならない｡もしそうでないと､ Tcl_DbCkfree と Tcl_DbCkalloc が､或は Tcl_Alloc と Tcl_Free が､のどちらかの未定義の連結不具合が生じる｡ TCL_MEM_DEBUG must be either left defined for all modules or undefined for all modules that are going to be linked together. If they are not, link errors will occur, with either Tcl_DbCkfree and Tcl_DbCkalloc or Tcl_Alloc and Tcl_Free being undefined.

一度､記憶域不都合の修復の運営がTcl 内に翻訳されると､ C 函数の Tcl_ValidateAllMemory と Tcl_DumpActiveMemory 及び Tcl memory 命令は記憶域利用の妥当性確認と検査が使えるようになる｡ Once memory debugging support has been compiled into Tcl, the C functions Tcl_ValidateAllMemory, and Tcl_DumpActiveMemory, and the Tcl memory command can be used to validate and examine memory usage.

### 保護区域 GUARD ZONES

記憶域の修復が可能にされる時､何時であれ ckalloc への呼出がなされ､要求より幾らか余分の記憶域が割付けられ､それにより記憶域修復命令譜は記憶域割付の追跡の保守が可能になり､呼出し側に返された区域の前と後に８バイトずつの “保護 区域” が置かれる｡(保護区域の寸法はファイル generic/tclCkalloc.c 内の C #define LOW_GUARD_SIZE と #define HIGH_GUARD_SIZE によって定義され､出来ばえの代償として､多重書込み不具合を疑う場合は拡張可能である｡) ckfree への呼出しで､保護 区域に既知の紋様が記入された後､解放される保護区域が､何かの方法で修正されていないかを検査される｡もしされている場合､保護バイトとその新しい内容は識別され､ “低い保護区域違反” 又は “高い保護区域違反” の伝達文が発行される｡その “保護区域違反” 伝言文は記憶域領域の番地とファイル名と ckfree を呼んだ符合命令の行数を含む｡これにより1回限りの問題の共通の種類を検出する､譬えば､それが記入されるデータの内容に割付ける区域が不充分であった､の如きである｡ When memory debugging is enabled, whenever a call to ckalloc is made, slightly more memory than requested is allocated so the memory debugging code can keep track of the allocated memory, and eight-byte “guard zones” are placed in front of and behind the space that will be returned to the caller. (The sizes of the guard zones are defined by the C #define LOW_GUARD_SIZE and #define HIGH_GUARD_SIZE in the file generic/tclCkalloc.c — it can be extended if you suspect large overwrite problems, at some cost in performance.) A known pattern is written into the guard zones and, on a call to ckfree, the guard zones of the space being freed are checked to see if either zone has been modified in any way. If one has been, the guard bytes and their new contents are identified, and a “low guard failed” or “high guard failed” message is issued. The “guard failed” message includes the address of the memory packet and the file name and line number of the code that called ckfree. This allows you to detect the common sorts of one-off problems, where not enough space was allocated to contain the data written, for example.

### DEBUGGING DIFFICULT MEMORY CORRUPTION PROBLEMS

通常､記憶域修復を可能にする Tcl 言語翻訳は崩壊の不具合の分離を容易にする｡記憶域命令に記憶域妥当性確認切替を実行にしておくことにより､困難な問題を分離できる｡もし命令の発生に対して Tcl 解釈実行機能が余り充分に進まない内に崩壊が生じると疑う(確信する)場合は､ MEM_VALIDATE 定義を設定し tclCkalloc.c を再翻訳して Tcl を再度作成することも可能である｡これにより､最初の ckalloc 呼出しから記憶域妥当性確認が可能になり､出来ばえの効果が大きくなる｡ Normally, Tcl compiled with memory debugging enabled will make it easy to isolate a corruption problem. Turning on memory validation with the memory command can help isolate difficult problems. If you suspect (or know) that corruption is occurring before the Tcl interpreter comes up far enough for you to issue commands, you can set MEM_VALIDATE define, recompile tclCkalloc.c and rebuild Tcl. This will enable memory validation from the first call to ckalloc, again, at a large performance impact.

もし絶望的な場合､毎回の ckalloc と ckfree の呼出しの妥当性確認では不十分であり､明示的に Tcl_ValidateAllMemory をどの時点でも直接呼出せる｡それは､通常ファイル名や呼出しの行番号である char * や int をとり､望ましいことは何でもなる｡問題を見つけた後は取外すことを忘れないこと｡ If you are desperate and validating memory on every call to ckalloc and ckfree is not enough, you can explicitly call Tcl_ValidateAllMemory directly at any point. It takes a char * and an int which are normally the filename and line number of the caller, but they can actually be anything you want. Remember to remove the calls after you find the problem.

### SEE ALSO

ckalloc, memory, Tcl_ValidateAllMemory, Tcl_DumpActiveMemory

### KEYWORDS

memory, debug
Copyright © 1992-1999 Karl Lehenbauer & Mark Diekhans.
Copyright © 2000 Scriptics Corporation.