使用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;
}
可能是什么问题?谢谢你的回答。
你用一个指针初始化tzl[2]
4个字节的块:
tzl[MAX_INDEX] = z_m; /* z_m is malloc(4) */
但后来你是把它当作一个指向struct block
:
tzl[MAX_INDEX] -> suiv = NULL;
声明z_m
为struct block *
和变化malloc(1<<MAX_INDEX)
至malloc(sizeof(struct block))
作为开始。
您还应该检查以确保malloc
未返回NULL,并且您应该避免投射malloc
的返回值。
好的!谢谢亲爱的,它在某种程度上有所帮助! 但是,你知道为什么gdb可以找出错误吗? –
gdb不检查你是否不会滥用内存。这里的误用是轻微的,你很可能会“放弃它”(也就是说,即使代码有问题,代码似乎也能正常运行)。 valgrind更仔细地检查。 valgrind很高兴为你找到了问题。 –
能否请你解释一下(或者换一种说法)“但是当我使用gdb的时候我能想到它”? –
顺便说一句,你的符号(函数和变量)的名字实际上是不可读的(至少对于普通的英语读者来说,这是问题的预期发布方式)。 –
对不起!我试着添加一些评论。当我使用gdb时,进程正常终止,这对于我考虑valgrind中的错误是很奇怪的! –