【问题标题】:Valgrind gives incorrect line numbersValgrind 给出不正确的行号
【发布时间】: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 应该给出的响应不同(指出错误所在的行),它给了我一个非常不确定的响应,正如我在主帖中所说的那样。
  • 行为未定义,这意味着即使在运行之间也会发生实际变化。未定义的行为是不可预测的,因此响应当然是不确定的。

标签: c ubuntu valgrind


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2013-04-09
      • 2022-01-19
      相关资源
      最近更新 更多