【问题标题】:Debugging with valgrind and gdb使用 valgrind 和 gdb 进行调试
【发布时间】:2016-03-06 11:41:02
【问题描述】:

下午好!这是我在这里的第一篇文章!

我在使用 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;
}

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

【问题讨论】:

  • 您能否解释(或改写)“但是当我使用 gdb 时我什么时候能弄明白”这句话?
  • 顺便说一句,您的符号(函数和变量)名称实际上是不可读的(至少对于普通的英文读者来说,这是期望在此处发布问题的方式)。
  • 对不起!我尝试添加一些 cmets。当我使用 gdb 时,进程正常终止,考虑到 valgrind 中的错误,这对我来说很奇怪!
  • Tank you!?! ;-)
  • @Cool Guy:这只是一个错字!

标签: c pointers gdb valgrind


【解决方案1】:

您正在使用指向 4 字节块的指针初始化 tzl[2]

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

但是你把它当作一个指向struct block的指针:

tzl[MAX_INDEX] -> suiv = NULL;

首先将z_m 声明为struct block *,然后将malloc(1&lt;&lt;MAX_INDEX) 更改为malloc(sizeof(struct block))

您还应该检查以确保 malloc 没有返回 NULL,并且您应该避免强制转换 malloc 的返回值。

【讨论】:

  • 好的!谢谢亲爱的,它在某种程度上有所帮助!但是,你知道为什么 gdb 可以找出错误吗?
  • gdb 不会检查您是否滥用内存。这里的误用是轻微的,您很可能会“逍遥法外”(也就是说,代码似乎运行正确,即使它有问题)。 valgrind 检查得更仔细。很高兴 valgrind 为您找到了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2015-07-01
  • 2021-03-17
  • 2011-05-01
  • 1970-01-01
相关资源
最近更新 更多