如何在GNU C中使用mcheck进行堆一致性检查

How to use mcheck for Heap Consistency Check in GNU C?

本文关键字:mcheck 检查 一致性 GNU      更新时间:2023-10-16

我正在努力了解堆一致性检查在GNU C库中是如何工作的。I参考http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html#Heap-一致性检查

这是我写的一个示例程序。正如手册中所建议的那样,如果我在gdb中运行并调用mcheck(0),我的自定义abortfn将被调用。但它没有被召唤。

我在这里错过了什么?

包括必要的标题。

void *abortfn(enum mcheck_status status)
{
    switch(status) {
    case MCHECK_DISABLED:
            printf("MEMCHECK DISABLEDn");
            break;
    default:
            printf("MEMCHECK ENABLEDn");
    }
}
int main()
{
    printf("This is mcheck testing coden");
    int *a = (int *) malloc(sizeof(int));
    *a = 10;
    printf("A: %dn", *a);
    free(a); 
    return 0; 
}

今天,编译所有警告&调试信息(gcc -Wall -Wextra -g)则使用valgrind更方便。

然而,您链接到的文档中显示:

一旦用malloc 分配了任何东西,就太晚了,无法开始分配检查

因此,将main作为启动

 int main() {
   mcheck(abortfn); 

但是,您的abortfn应该返回void,因此将其编码为:

 void abortfn(enum mcheck_status status) {                                  
   switch(status) {                                                        
    case MCHECK_DISABLED:                                           
        printf("MEMCHECK DISABLEDn");                 
        break;                               
    default:                             
        printf("MEMCHECK ENABLEDn");                    
} }