Memory(3tcl) Memory(3tcl)

ckalloc, memory, ckfree, Tcl_DisplayMemory, Tcl_InitMemory, Tcl_ValidateAllMemory - 合法的記憶體分配介面


memory info
memory trace [on|off]
memory validate [on|off]
memory trace_on_at_malloc nnn
memory break_on_malloc nnn
memory display file

#include <tcl.h>

char *
ckalloc (unsigned size)

ckfree (char *ptr)

Tcl_DumpActiveMemory (char *fileName);

Tcl_ValidateAllMemory (char *file,
                       int   line)
Tcl_InitMemory (interp)

Tcl_Interp *fileName uint size in

char *ptr in Tcl_Interp *interp in A pointer to the Tcl interpreter. char *file in The filename of the caller of Tcl_ValidateAllMemory. int line in The line number of the caller of Tcl_ValidateAllMemory. char *fileName in File to display list of active memory.


This macro allocates memory, in the same manner as malloc, with the following differences: One, ckalloc checks the value returned from malloc (it calls malloc for you) and panics if the allocation request fails. Two, if enabled at compile time, a version of ckalloc with special memory debugging capabilities replaces the normal version of ckalloc, which aids in detecting memory overwrites and leaks (repeated allocations not matched by corresponding frees).


o size - The size of the memory block to be allocated.


A pointer to the allocated memory block.

This macro frees memory allocated by ckalloc. Like ckalloc, when memory debugging is enabled, ckfree has enhanced capabilities for detecting memory overwrites and leaks.

It is very important that you use ckalloc when you need to allocate memory, and that you use ckfree to free it. Should you use malloc to allocate and ckfree to free, spurious memory validation errors will occur when memory debugging is enabled. Should you use free to free memory allocated by ckalloc, memory corruption will occur when memory debugging is enabled. Any memory that is to be become the property of the Tcl interpreter, such as result space, must be allocated with ckalloc. If it is absolutely necessary for an application to pass back malloced memory to Tcl, it will work only if Tcl is complied with the TCL_MEM_DEBUG flag turned off. If you convert your application to use this facility, it will help you find memory over runs and lost memory. Note that memory allocated by a C library routine requiring freeing should still be freed with free, since it calls malloc rather than ckalloc to do the allocation.


o ptr - The address of a block to free, as returned by ckalloc.

This function will output a list of all currently allocated memory to the specified file. The following information is outputted for each allocated block of memory: starting and ending addresses (excluding guard zone), size, source file where ckalloc was called to allocate the block and line number in that file. It is especially useful to call Tcl_DumpActiveMemory after the Tcl interpreter has been deleted.


o fileName - The name of the file to output the memory list to.

Forces a validation of the guard zones of all currently allocated blocks of memory. Normally validation of a block occurs when its freed, unless full validation is enabled, in which case validation of all blocks occurs when ckalloc and ckfree are called. This function forces the validation to occur at any point.


o file - The file that this routine is being called from, normally __FILE__.
o line - The line that this routine is being called from, normally __LINE__.

To enable memory debugging, Tcl should be recompiled from scratch with TCL_MEM_DEBUG defined. This will also compile in a non-stub version of Tcl_InitMemory to add the memory command to Tcl.

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 TclDbCkfree and Tcl_DbCkalloc or Tcl_Ckalloc and Tcl_Ckfree being undefined.

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 also eight-byte ``guard zones'' are placed in front of and behind the space that will be returned to the caller. (The size of the guard zone is defined by the C #define GUARD_SIZE in baseline/src/ckalloc.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.

The Tcl memory command gives the Tcl developer control of Tcl's memory debugging capabilities. The memory command has several suboptions, which are described below. It is only available when Tcl has been compiled with memory debugging enabled.

生成一個報告,包含自從 Tcl 啟動以來分配和釋放的(記憶體)總數,當前分配的包(未遇到相應的到 ckfree 的呼叫的到 ckalloc 的呼叫的當前數目)的數目,當前分配的位元組數,和已分配的包和位元組的最大的數目。

使記憶體跟蹤開啟或關閉。在開啟記憶體跟蹤的時候,對 ckalloc 的每次呼叫都導致向 stderr 寫一行跟蹤資訊,其組成有字 ckalloc,隨後是返回的地址,分配的記憶體總數,和進行分配的 C 檔名和程式碼的行數。例如:...

ckalloc 40e478 98 tclProc.c 1406

Calls to ckfree are traced in the same manner, except that the word ckalloc is replaced by the word ckfree.

使記憶體生效(validation)開啟或關閉。在開啟記憶體生效的時候,在對ckallocckfree 的每次呼叫上,檢查用 ckalloc 分配的每塊現存的記憶體的守衛區(guard zone)。這有很大的效能影響而只在強烈懷疑有覆寫(overwrite)問題的時候才使用。開啟記憶體生效的益處是在覆寫發生之後第一次呼叫 ckallocckfree 的時候就能檢測到守衛區覆寫,而不是在釋放有覆寫守衛區的記憶體的時候,釋放可能在記憶體覆寫發生之後才發生。

在進行了 count 數目 ckalloc 之後啟用記憶體跟蹤。例如,如果你鍵入了 memory trace_on_at_malloc 100,在第 100 次呼叫 ckalloc 之後,將對所有分配和釋放的記憶體顯示記憶體跟蹤資訊。因為在一個問題發生之前可能有許多記憶體活動,如果你能在問題出現( sets in)之前標識出一定數目的分配,決定(judicious)使用這個選項可以減輕跟蹤導致的速度變慢(和生成的跟蹤資訊總數)。在發生一個守衛區錯誤時,輸出自從 Tcl 啟動以來發生的記憶體分配的當前數目。

在進行了 count 數目的 ckalloc 分配之後,輸出一個(中斷)訊息,表示它現在想進入 C 偵錯程式。 Tcl 將向自身發出一個 SIGINT 訊號。如果你在一個 C 偵錯程式下執行 Tcl,它將接著進入偵錯程式命令模式。


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.

If you are desperate and validating memory on every call to ckalloc and ckfree isn't 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.


ckalloc, ckfree, free, memory, malloc



《中國 Linux 論壇 man 手冊頁翻譯計劃》:

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃: