4

我目前正在运行 Ubuntu Raring Ringtail x86。全新安装和更新后,我根据“Learning C The Hard Way”教程中的说明安装了 Valgrind 3.8.1。但是,我可以运行 Valgrind,而不是在代码中给出错误的行号,它只会给我这个:

==9300==    by 0x4060714: (below main) (libc-start.c:227)

完整的 Valgrind 报告在这里: http: //pastebin.com/1spmkFrU

我确定我正在使用 -g 标志,并且使用--track-origins=yes只会显示错误函数的开始位置,而不是函数内错误的位置。(这是使用--track的结果: http : //pastebin.com/ktvY8HEM )

这是我正在尝试使用的生成文件和代码:

生成文件:

CFLAGS=-Wall -g

EXECUTABLES=ex1 ex3 ex4

all: $(EXECUTABLES)

clean:
    rm -f $(EXECUTABLES)

代码:

#include <stdio.h>

/*This program is purposefully broken */

int main()
{
    int age = 10;
    int height;

    printf("I am %d years old.\n");
    printf("I am %d inches tall.\n", height);

return 0;
}
4

2 回答 2

0

堆栈分配语义main()有点奇怪。尝试将错误代码放在另一个函数中,从 调用它main(),您可能会得到更有意义的结果。

更重要的是,尝试将-Wall和添加-O到您的CFLAGS. 未使用的变量和误用printf()都可以在编译时检测到。

于 2012-11-29T06:23:21.983 回答
0

这发生在我身上,在同一个教程的练习 8 中。即使启用了跟踪,Valgrind 也没有发现访问非法地址的行。

似乎对程序来说不是致命的错误,但包括访问非法地址的内存,Valgrind 没有“固定”。您可以在此处阅读有关这些内容的更多信息: Valgrind 文档摘录

我猜 Valgrind 不会让你免于访问记忆中的错误位置,所以我们必须格外小心。

于 2013-05-09T13:26:33.497 回答