使用valgrind和gdb进行调试

问题描述:

下午好!这是我第一次发帖!使用valgrind和gdb进行调试

当我使用valgrind时,我有一个无效的写入错误,但是当我使用gdb时我可以计算出它!

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_INDEX 2 

void *z_m = 0; 
struct block { 
    struct block * suiv; 
}; 

//Declaration of a global array 
struct block * tzl[MAX_INDEX+1]; 

//Function used to dislay tzl in the main. 
void display() { 
    for(int i=0; i<=MAX_INDEX; i++) { 
     struct bloc * tmp = tzl[i]; 
     printf("%d => ",i); 
     while (tmp!=NULL) { 
      printf(" %li ->",(unsigned long)tmp); 
      tmp = tmp -> suiv; 
     } 
     printf("\n"); 
    } 
} 

int main() { 
    z_m = (void *) malloc(1<<MAX_INDEX); 
    for (int i=0; i<MAX_INDEX; i++) 
    { 
     tzl[i] = NULL; 
    } 
    tzl[MAX_INDEX] = z_m; 
    //Here is the problem with valgrind 
    tzl[MAX_INDEX] -> suiv = NULL; 
    display(); 
    free(z_m); 
    return 0; 
} 

可能是什么问题?谢谢你的回答。

+0

能否请你解释一下(或者换一种说法)“但是当我使用gdb的时候我能想到它”? –

+0

顺便说一句,你的符号(函数和变量)的名字实际上是不可读的(至少对于普通的英语读者来说,这是问题的预期发布方式)。 –

+0

对不起!我试着添加一些评论。当我使用gdb时,进程正常终止,这对于我考虑valgrind中的错误是很奇怪的! –

你用一个指针初始化tzl[2] 4个字节的块:

tzl[MAX_INDEX] = z_m; /* z_m is malloc(4) */ 

但后来你是把它当作一个指向struct block

tzl[MAX_INDEX] -> suiv = NULL; 

声明z_mstruct block *和变化malloc(1<<MAX_INDEX)malloc(sizeof(struct block))作为开始。

您还应该检查以确保malloc未返回NULL,并且您应该避免投射malloc的返回值。

+0

好的!谢谢亲爱的,它在某种程度上有所帮助! 但是,你知道为什么gdb可以找出错误吗? –

+0

gdb不检查你是否不会滥用内存。这里的误用是轻微的,你很可能会“放弃它”(也就是说,即使代码有问题,代码似乎也能正常运行)。 valgrind更仔细地检查。 valgrind很高兴为你找到了问题。 –