【发布时间】:2015-08-30 08:42:58
【问题描述】:
我正在学习关于 Valgrind 的艰难学习 C 中的章节,但是尽管使用了 -g,但我的行号没有显示出来。我正在运行 Yosemite 10.10.3 和 Valgrind 3.10.1。
我的 Makefile:
CC = gcc
CFLAGS=-Wall -g -static
FILES = ex1 ex3 ex4
all: $(FILES)
ex1: ex1.c
$(CC) $(CFlAGS) -o ex1 ex1.c
ex3: ex3.c
$(CC) $(CFlAGS) -o ex3 ex3.c
ex4: ex4.c
$(CC) $(CFlAGS) -o ex4 ex4.c
clean:
$(RM) $(FILES)
还有我的 ex4.c 文件:(故意损坏)
#include <stdio.h>
int main(int argc, char *argv[]){
int age = 18;
int height;
printf("I am %d years old.\n");
printf("I am %d inches tall.\n", height);
return 0;
}
我查看了this,这是我在 Ubuntu 上遇到的确切问题,但该解决方案对我不起作用。我还创建了我的 .dSYM 文件。我的 valgrind 输出是:
MacBook-Pro:c jaredramirez$ valgrind --dsymutil=yes --track-origins=yes
./ex4
==649== Memcheck, a memory error detector
==649== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==649== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info
==649== Command: ./ex4
==649==
--649-- run: /usr/bin/dsymutil "./ex4"
warning: no debug symbols in executable (-arch x86_64)
==649== Conditional jump or move depends on uninitialised value(s)
==649== at 0x1003FAC3F: _platform_memchr$VARIANT$Haswell (in /usr/lib/system/libsystem_platform.dylib)
==649== by 0x1001EEB96: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F8FE5: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x10021E9AE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x10021EC80: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F4B71: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F29D7: printf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x100000F2D: main (in ./ex4)
==649== Uninitialised value was created by a stack allocation
==649== at 0x1001F4BF8: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==649==
I am 75508496 years old.
==649== Conditional jump or move depends on uninitialised value(s)
==649== at 0x1001F69F1: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x10021E9AE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x10021EC80: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F4B71: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F29D7: printf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x100000F41: main (in ./ex4)
==649== Uninitialised value was created by a stack allocation
==649== at 0x7FFF5FC01036: _dyld_start (in /usr/lib/dyld)
==649==
==649== Conditional jump or move depends on uninitialised value(s)
==649== at 0x1001F6B1B: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x10021E9AE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x10021EC80: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F4B71: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F29D7: printf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x100000F41: main (in ./ex4)
==649== Uninitialised value was created by a stack allocation
==649== at 0x7FFF5FC01036: _dyld_start (in /usr/lib/dyld)
==649==
==649== Conditional jump or move depends on uninitialised value(s)
==649== at 0x1001F9555: __ultoa (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F6B5E: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x10021E9AE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x10021EC80: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F4B71: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F29D7: printf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x100000F41: main (in ./ex4)
==649== Uninitialised value was created by a stack allocation
==649== at 0x7FFF5FC01036: _dyld_start (in /usr/lib/dyld)
==649==
==649== Syscall param write(buf) points to uninitialised byte(s)
==649== at 0x1002F997A: write$NOCANCEL (in /usr/lib/system/libsystem_kernel.dylib)
==649== by 0x1001F39EC: _swrite (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001EC4A6: __sflush (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001EEC50: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F906C: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x10021E9AE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x10021EC80: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F4B71: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F29D7: printf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x100000F41: main (in ./ex4)
==649== Address 0x100820385 is 5 bytes inside a block of size 4,096 alloc'd
==649== at 0x1000084BB: malloc (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==649== by 0x1001EF836: __smakebuf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x100204387: __swsetup (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x10021E75D: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x10021EC80: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F4B71: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x1001F29D7: printf (in /usr/lib/system/libsystem_c.dylib)
==649== by 0x100000F2D: main (in ./ex4)
==649== Uninitialised value was created by a stack allocation
==649== at 0x7FFF5FC01036: _dyld_start (in /usr/lib/dyld)
==649==
I am 0 inches tall.
==649==
==649== HEAP SUMMARY:
==649== in use at exit: 38,782 bytes in 425 blocks
==649== total heap usage: 504 allocs, 79 frees, 44,886 bytes allocated
==649==
==649== LEAK SUMMARY:
==649== definitely lost: 0 bytes in 0 blocks
==649== indirectly lost: 0 bytes in 0 blocks
==649== possibly lost: 0 bytes in 0 blocks
==649== still reachable: 0 bytes in 0 blocks
==649== suppressed: 38,782 bytes in 425 blocks
==649==
==649== For counts of detected and suppressed errors, rerun with: -v
==649== ERROR SUMMARY: 6 errors from 5 contexts (suppressed: 0 from 0)
【问题讨论】:
-
valgrind的输出显示warning: no debug symbols in executable (-arch x86_64),这强烈表明构建存在问题 — “没有使用 @987654327 运行编译器/链接器@option”的种类。另一种方法是调试符号不是valgrind识别的。您使用的是哪个版本的valgrind?是你建造的还是别人建造的?您使用的是哪个 C 编译器? -
而且,FWIW,我的默认编译选项不会让错误的代码编译。我使用
-Werror,并收到 5 个关于格式错误、未使用变量、两个未使用参数和使用未初始化变量的警告/错误。当然,这只是一个用于验证的试验程序,但是…… -
在尝试了所有其他方法之后,我放弃了
gcc,现在用clang编译。就我而言,只有微小的差异,但有更多的优点(例如更清晰的指示错误的方式,而且确实,valgrind 抱怨的更少)。 -
您的 makefile 定义了
CFLAGS,但编译使用$(CFlAGS)(小写 ell),因此不使用-g选项。这是问题中的小故障还是问题的根源? -
使用你的代码和我的
valgrind版本(3.11.0-SVN,2014 年 11 月从 SVN 收集),在 Yosemite (10.10.3) 上运行,使用我自制的 GCC 5.1。 0 并且不使用-static(我没有-lcrt0.o选项的相关启动文件),我在错误输出中得到行号。我还使用当前版本的 XCode 获得它们(/usr/bin/gcc --version部分表示Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) Target: x86_64-apple-darwin14.3.0。)