【问题标题】:Valgrind - Can't understand error outputValgrind - 无法理解错误输出
【发布时间】:2023-03-25 08:33:01
【问题描述】:

如果我最终做错了什么,我很抱歉。 好的,我的问题如下:

我刚刚编写了一些非常简单的代码,但是当您查看 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 个错误?

提前致谢。 最好的问候

【问题讨论】:

  • 你知道你的 libc 是否没有错误吗?例如,libc 可能会 malloc() 一些内存并且永远不会释放,因为 main() 末尾的 exit() 确实会终止进程。
  • 我不知道如何解决它。

标签: c debugging valgrind


【解决方案1】:

如果您使用--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 生成this suppressions file 来抑制它们。那么输出就更干净了:

$ 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)

【讨论】:

    【解决方案2】:

    目前正在积极开发对 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
    

    【讨论】:

    • 他已经在用trunk版了,也可以用brew install valgrind --HEAD安装。不幸的是,即使是今天的主干(valgrind-3.11.0.SVN,r14976)仍然会发出这些消息。祝您继续进行 OS X 压制工作好运,感谢您这样做。
    猜你喜欢
    • 2011-12-03
    • 1970-01-01
    • 2016-01-16
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多