2015-03-02 91 views
2

对不起,如果我最终做错了什么。 好我的问题是这样的:Valgrind - 无法理解错误输出

我只是编码的东西很容易,但是当你在Valgrind的错误输出来看看它只是让我困惑。

代码:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
int num1 = 100; 
double num2 = 1.2; 

printf("Number 1 one is: %d.\n Number two is: %f.\n", num1, num2); 

return 0; 
} 

Valgrind的错误报告:

$ valgrind --leak-check=full ./yaq 
==50642== Memcheck, a memory error detector 
==50642== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et  al. 
==50642== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for  copyright info 
==50642== Command: ./yaq 
==50642== 
--50642-- ./yaq: 
--50642-- dSYM directory has wrong UUID; consider using --dsymutil=yes 
==50642== Conditional jump or move depends on uninitialised value(s) 
==50642== at 0x1003FCC3F: _platform_memchr$VARIANT$Haswell (in  /usr/lib/system/libsystem_platform.dylib) 
==50642== by 0x1001F0B96: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) 
==50642== by 0x1001FAFE5: __vfprintf (in /usr/lib/system/libsystem_c.dylib) 
==50642== by 0x1002209AE: __v2printf (in /usr/lib/system/libsystem_c.dylib) 
==50642== by 0x100220C80: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==50642== by 0x1001F6B71: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==50642== by 0x1001F49D7: printf (in /usr/lib/system/libsystem_c.dylib) 
==50642== by 0x100000F32: main (in ./yaq) 
==50642== 
Number 1 one is: 100. 
Number two is: 1.200000. 
==50642== 
==50642== HEAP SUMMARY: 
==50642==  in use at exit: 38,673 bytes in 427 blocks 
==50642== total heap usage: 510 allocs, 83 frees, 44,945 bytes. 
==50642== To see them, rerun with: --leak-check=full --show-leak- kinds=all 
==50642== 
==50642== For counts of detected and suppressed errors, rerun with: -v 
==50642== Use --track-origins=yes to see where uninitialised values come from 
==50642== ERROR SUMMARY: 3 errors from 1 contexts (suppressed: 17 from 17) 

它为什么说3个错误?

在此先感谢。 最好的问候

+0

你知道,如果你的libc中没有错误?例如,libc可能会有一次内存malloc()而永远不会释放,因为main()结束处的exit()确实终止了进程。 – Jens 2015-03-02 20:06:16

+0

我无法弄清楚如何解决它。 – IRootI 2015-03-02 23:14:48

回答

4

您可能能够看到他们,如果你有--show-leak-kinds=all运行:

==96034== Memcheck, a memory error detector 
==96034== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==96034== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info 
==96034== Command: ./yaq 
==96034== 
--96034-- ./yaq: 
--96034-- dSYM directory is missing; consider using --dsymutil=yes 
==96034== Conditional jump or move depends on uninitialised value(s) 
==96034== by 0x10021FCA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x1001F5B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x1001F39F7: printf (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x100000F32: main (in ./yaq) 
==96034== 
==96034== 80 bytes in 1 blocks are still reachable in loss record 48 of 85 
==96034== at 0x10000859B: malloc (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) 
==96034== by 0x1001D1756: __Balloc_D2A (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x1001D2075: __d2b_D2A (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x1001CE88B: __dtoa (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x1001F6D72: __vfprintf (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x10021F9CE: __v2printf (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x10021FCA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x1001F5B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x1001F39F7: printf (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x100000F32: main (in ./yaq) 
==96034== 
==96034== 4,096 bytes in 1 blocks are still reachable in loss record 85 of 85 
==96034== at 0x10000859B: malloc (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) 
==96034== by 0x1001F0856: __smakebuf (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x1002053A7: __swsetup (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x10021F77D: __v2printf (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x10021FCA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x1001F5B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x1001F39F7: printf (in /usr/lib/system/libsystem_c.dylib) 
==96034== by 0x100000F32: main (in ./yaq) 
==96034== 
==96034== LEAK SUMMARY: 
==96034== definitely lost: 0 bytes in 0 blocks 
==96034== indirectly lost: 0 bytes in 0 blocks 
==96034==  possibly lost: 0 bytes in 0 blocks 
==96034== still reachable: 4,244 bytes in 4 blocks 
==96034==   suppressed: 34,783 bytes in 425 blocks 
==96034== 
==96034== For counts of detected and suppressed errors, rerun with: -v 
==96034== Use --track-origins=yes to see where uninitialised values come from 
==96034== ERROR SUMMARY: 3 errors from 1 contexts (suppressed: 18 from 18) 

这些都是在OS X系统库的问题。我通过生成this suppressions filevalgrind --leak-check=yes --show-leak-kinds=all --gen-suppressions=yes ./yaq来压制他们。输出是一个更清洁然后:

$ valgrind --leak-check=yes --show-leak-kinds=all --suppressions=yaq.supp ./yaq       [7:47:49] 
==96285== Memcheck, a memory error detector 
==96285== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==96285== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info 
==96285== Command: ./yaq 
==96285== 
--96285-- ./yaq: 
--96285-- dSYM directory is missing; consider using --dsymutil=yes 
Number 1 one is: 100. 
Number two is: 1.200000. 
==96285== 
==96285== HEAP SUMMARY: 
==96285==  in use at exit: 39,027 bytes in 429 blocks 
==96285== total heap usage: 510 allocs, 81 frees, 45,171 bytes allocated 
==96285== 
==96285== LEAK SUMMARY: 
==96285== definitely lost: 0 bytes in 0 blocks 
==96285== indirectly lost: 0 bytes in 0 blocks 
==96285==  possibly lost: 0 bytes in 0 blocks 
==96285== still reachable: 0 bytes in 0 blocks 
==96285==   suppressed: 39,027 bytes in 429 blocks 
==96285== 
==96285== For counts of detected and suppressed errors, rerun with: -v 
==96285== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 21 from 19) 
1

Valgrind支持OS X目前正在积极的工作。您最好的方法是确保您使用的是SVN中继版本,并经常更新。

Valgrind向您报告的错误存在于OS X系统库中。这些不是你的程序的错误,而是因为即使是简单的程序,包括这些系统库Valgrind也继续选择它们。 Valgrind主干中的抑制不断更新以解决这些问题,使您能够专注于代码中可能存在的实际问题。

下面的命令将允许你使用Valgrind的树干,如果您尚未:

svn co svn://svn.valgrind.org/valgrind/trunk valgrind 
cd valgrind 
./autogen.sh 
./configure 
make -j4 
sudo make install 
+0

他已经在使用中继版本,也可以使用'brew install valgrind --HEAD'来安装。不幸的是,即使是今天的主干(valgrind-3.11.0.SVN,r14976)仍然会发出这些消息。祝你好运继续OS X抑制努力,并感谢你这样做。 – 2015-03-04 22:30:40