我目前正在运行Ubuntu Raring Ringtail x86。在全新安装和更新之后,我根据“学习C艰难之路”教程中的说明安装了Valgrind 3.8.1。我可以运行Valgrind,而不是在代码中给出错误的行号,它只会给我这个:
==9300== by 0x4060714: (below main) (libc-start.c:227)
Full Valgrind报告:http://pastebin.com/1spmkFrU
我确定我正在使用-g标志,并且使用 - track-originins = yes 只会显示错误的函数开始的位置,而不是错误在函数内的位置。 (这是使用 - track :http://pastebin.com/ktvY8HEM)
的结果这是我正在尝试使用的makefile和代码:
生成文件:
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;
}
答案 0 :(得分:0)
main()
的堆栈分配语义有点奇怪。尝试将错误代码放入另一个函数中,从main()
调用它,您可能会得到更有意义的结果。
更重要的是,尝试将-Wall
和-O
添加到CFLAGS
。可以在编译时检测未使用的变量和printf()
的误用。
答案 1 :(得分:0)
在相同的教程中,这发生在练习8上。即使启用了跟踪,Valgrind也没有发现访问非法地址的行。
似乎错误对于程序来说并不致命,但包括访问非法地址的内存,并不是由Valgrind“固定下来”。 您可以在这里阅读更多相关信息: Excerpt from Valgrind documentation
我猜Valgrind不会让你无法进入记忆中的错误位置,所以我们必须格外谨慎。