NAME
ckalloc, memory, ckfree, Tcl_DisplayMemory, Tcl_InitMemory, Tcl_ValidateAllMemory - 合法的記憶體分配介面總覽 SYNOPSIS
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)void ckfree (char *ptr)int Tcl_DumpActiveMemory (char *fileName);void Tcl_ValidateAllMemory (char *file, int line) void Tcl_InitMemory (interp)
ARGUMENTS
Tcl_Interp *fileName uint size in描述 DESCRIPTION
ckalloc
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). Parameters:
o size - The size of the memory
block to be allocated.
Returns:
A pointer to the allocated memory block.
ckfree
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. Parmeters:
o ptr - The address of a block
to free, as returned by ckalloc.
Tcl_DumpActiveMemory
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. Parameters:
o fileName - The name of the
file to output the memory list to.
Tcl_ValidateAllMemory
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. Parameters:
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__.
ENABLING MEMORY DEBUGGING
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.GUARD ZONES
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 MEMORY COMMAND
- memory options
-
- memory info
-
- memory trace [on|off]
-
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.
- memory validate [on|off]
-
- memory trace_on_at_malloc nnn
-
- memory break_on_malloc nnn
-
- memory display file
-
DEBUGGING DIFFICULT MEMORY CORRUPTION PROBLEMS
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.關鍵字 KEYWORDS
ckalloc, ckfree, free, memory, malloc[中文版維護人]
寒蟬退士[中文版最新更新]
2001/09/28《中國 Linux 論壇 man 手冊頁翻譯計劃》:
http://cmpp.linuxforum.net跋
本頁面中文版由中文 man 手冊頁計劃提供。Tcl |