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

时间:2015-02-15 18:35:27

标签: c++ c gdb gnu

我试图了解堆一致性检查在GNU C库中的工作原理。我提到了http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html#Heap-Consistency-Checking

这是我编写的示例程序。如果我在gdb中运行并调用mcheck(0)我的自定义abortfn将被调用,我按照手册中的建议进行了预期。但它没有被召唤。

我在这里缺少什么?

包含必要的标题。

void *abortfn(enum mcheck_status status)
{
    switch(status) {
    case MCHECK_DISABLED:
            printf("MEMCHECK DISABLED\n");
            break;
    default:
            printf("MEMCHECK ENABLED\n");
    }
}

int main()
{
    printf("This is mcheck testing code\n");
    int *a = (int *) malloc(sizeof(int));
    *a = 10;
    printf("A: %d\n", *a);
    free(a); 
    return 0; 
}

1 个答案:

答案 0 :(得分:2)

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

但是,您链接到的very文档说:

  

一旦你用malloc

分配任何东西,开始分配检查为时已晚

所以开始你的main

 int main() {
   mcheck(abortfn); 

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

 void abortfn(enum mcheck_status status) {                                  
   switch(status) {                                                        
    case MCHECK_DISABLED:                                           
        printf("MEMCHECK DISABLED\n");                 
        break;                               
    default:                             
        printf("MEMCHECK ENABLED\n");                    
} }