簡體   English   中英

Valgrind - 無法理解錯誤輸出

[英]Valgrind - Can't understand error output

如果我最終做錯了什么,我很抱歉。 好的,我的問題如下:

我只是編寫了一些非常簡單的代碼,但是當您查看 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個錯誤?

提前致謝。 此致

如果您使用--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 系統庫中的問題。 我通過使用valgrind --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)

目前正在積極致力於 OS X 上的 Valgrind 支持。 您最好的方法是確保您使用的是 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM