【发布时间】:2012-11-17 04:08:16
【问题描述】:
我目前正在运行 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)
这是我尝试使用的 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;
}
【问题讨论】:
-
“Ubuntu 13”?哪有这回事。使用例如
lsb_release -r获取正确的发布版本。 -
有,它叫“Raring Ringtail”。 cdimage.ubuntu.com/daily-live/current
-
可用的预发布映像是 pre-alpha,由于尚未发布,因此尚未称为 13.04。它只是被称为Raring Ringtail。此外,这个问题与你的发行版无关,因为你做了一些未定义的事情。未定义的行为会将导致奇怪的广告坏事发生。
-
好吧,我知道这有点误导。我没有初始化高度,也没有故意给第一个 printf 变量来尝试 Valgrind。然而,与 Valgrind 应该给出的响应不同(指出错误所在的行),它给了我一个非常不确定的响应,正如我在主帖中所说的那样。
-
行为未定义,这意味着即使在运行之间也会发生实际变化。未定义的行为是不可预测的,因此响应当然是不确定的。