MCHECK - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
mcheck,mcheck_check_all,mcheck_pedantic,mprobe-堆一致性检查
语法
#include <mcheck.h> int mcheck(void (*abortfunc)(enum mcheck_status mstatus)); int mcheck_pedantic(void (*abortfunc)(enum mcheck_status mstatus)); void mcheck_check_all(void); enum mcheck_status mprobe(void *ptr);
说明
mcheck()函数为malloc(3)系列内存分配函数安装了一组调试钩子。这些钩子导致对堆状态执行某些一致性检查。这些检查可以检测应用程序错误,例如不止一次释放一个内存块或破坏紧接在已分配内存块之前的簿记数据结构。
为了有效,必须在第一次调用malloc(3)或相关函数之前调用mcheck()函数。在难以确保的情况下,将程序与-lmcheck链接会在第一次调用内存分配函数之前插入对mcheck()的隐式调用(带有NULL参数)。
mcheck_pedantic()函数类似于mcheck(),但是只要调用其中一个内存分配函数,就对所有已分配的块执行检查。这可能很慢!
mcheck_check_all()函数会立即检查所有已分配的块。仅当预先调用mcheck()时此调用才有效。
如果系统检测到堆中的不一致,则使用单个参数mstatus调用abortfunc指向的调用者提供的函数,该参数指示检测到了哪种不一致类型。如果abortfunc为NULL,则默认函数会在stderr上显示一条错误消息,并调用abort(3)。
mprobe()函数对ptr指向的已分配内存块执行一致性检查。应该事先调用mcheck()函数(否则,mprobe()返回MCHECK_DISABLED)。
以下列表描述了在调用abortfunc时由mprobe()返回或作为mstatus参数传递的值:
- MCHECK_DISABLED(mprobe() only)
- 在调用第一个内存分配函数之前未调用mcheck()。一致性检查是不可能的。
- MCHECK_OK(mprobe() only)
- 未检测到不一致。
- MCHECK_HEAD
- 分配的块之前的内存遭到破坏。
- MCHECK_TAIL
- 分配的块之后的内存遭到破坏。
- MCHECK_FREE
- 一块内存被释放了两次。
返回值
mcheck()和mcheck_pedantic()成功返回0,错误返回-1。
版本
从glibc 2.2开始,可以使用mcheck_pedantic()和mcheck_check_all()函数。由于至少glibc 2.0,因此存在mcheck()和mprobe()函数
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
mcheck(),mcheck_pedantic(), mcheck_check_all(),mprobe() | Thread safety | MT-Unsafe race:mcheck const:malloc_hooks |
遵循规范
这些功能是GNU扩展。
备注
将程序与-lmcheck链接并使用MALLOC_CHECK_环境变量(在mallopt(3)中进行描述)会导致检测到相同类型的错误。但是,使用MALLOC_CHECK_不需要重新链接应用程序。
示例
下面的程序使用NULL参数调用mcheck(),然后两次释放相同的内存块。以下shell会话演示了运行程序时发生的情况:
$ ./a.out About to free About to free a second time block freed twice Aborted (core dumped)
Program source
#include <stdlib.h> #include <stdio.h> #include <mcheck.h> int main(int argc, char *argv[]) { char *p; if (mcheck(NULL) != 0) { fprintf(stderr, "mcheck() failed\n"); exit(EXIT_FAILURE); } p = malloc(1000); fprintf(stderr, "About to free\n"); free(p); fprintf(stderr, "\nAbout to free a second time\n"); free(p); exit(EXIT_SUCCESS); }
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。