【问题标题】:How would I discover the suppressed error in Valgrind?我如何发现 Valgrind 中被抑制的错误?
【发布时间】:2011-11-26 15:14:25
【问题描述】:

我有以下 valgrind 输出:

==28099== 
==28099== HEAP SUMMARY: 
==28099==     in use at exit: 0 bytes in 0 blocks
==28099==   total heap usage: 131 allocs, 131 frees, 3,472 bytes allocated
==28099== 
==28099== All heap blocks were freed -- no leaks are possible
==28099== 
==28099== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)
--28099-- 
--28099-- used_suppression:      2 dl-hack3-cond-1
--28099-- used_suppression:      2 glibc-2.5.x-on-SUSE-10.2-(PPC)-2a
==28099== 
==28099== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)

有 4 个抑制错误。虽然这里没有泄漏,但是在移植到另一个系统时会产生问题。

[编辑]

我也使用 valgrind -v 选项重新运行。但我没有发现任何错误。

 ==30287== Memcheck,内存错误检测器
 ==30287== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
 ==30287== 使用 Valgrind-3.6.0.SVN-Debian 和 LibVEX;使用 -h 重新运行以获取版权信息
 ==30287== 命令:./EXECUTABLE1 test_input.txt
 ==30287==
 --30287-- Valgrind 选项:
 --30287----suppressions=/usr/lib/valgrind/debian-libc6-dbg.supp
 --30287---v
 --30287-- --gen-suppressions=all
 --30287-- --error-limit=no
 --30287-- /proc/version 的内容:
 --30287-- Linux 版本 2.6.38.3.2.amd64-smp(gcc 版本 4.4.5 (Debian 4.4.5-8))#1 SMP Wed Apr 20 17:36:19 CEST 2011
 --30287-- Arch 和 hwcaps: AMD64, amd64-sse3-cx16
 --30287-- 页面大小:当前 4096,最大支持 4096
 --30287-- Valgrind 库目录:/usr/lib/valgrind
 --30287-- 从 /home/path/to/file(0x400000) 读取 syms
 --30287-- 从 /lib/ld-2.11.2.so (0x4000000) 读取符号
 --30287-- 考虑 /lib/ld-2.11.2.so ..
 --30287-- .. CRC 不匹配(计算 cd91cee9 需要 11b4673c)
 --30287-- 考虑 /usr/lib/debug/lib/ld-2.11.2.so ..
 --30287-- .. CRC 有效
 --30287-- 从 /usr/lib/valgrind/memcheck-amd64-linux (0x38000000) 读取 syms
 --30287-- 对象没有动态符号表
 --30287-- 读取抑制文件:/usr/lib/valgrind/debian-libc6-dbg.supp
 --30287-- 读取抑制文件:/usr/lib/valgrind/default.supp
  --30287-- REDIR: 0x4016230 (strlen) 重定向到 0x380408a7 (vgPlain_amd64_linux_REDIR_FOR_strlen)
 --30287-- 从 /usr/lib/valgrind/vgpreload_core-amd64-linux.so (0x4a20000) 读取 syms
  --30287-- 从 /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so (0x4c21000) 读取 sym
  ==30287== 警告:新重定向与现有重定向冲突——忽略它
  --30287-- 新:0x04016230 (strlen) R-> 0x04c25850 strlen
  --30287-- REDIR:0x40160a0(索引)重定向到 0x4c25460(索引)
  --30287-- REDIR: 0x4016120 (strcmp) 重定向到 0x4c25e30 (strcmp)
  --30287-- 从 /lib/libm-2.11.2.so (0x4e29000) 读取 sym
  --30287-- 考虑 /lib/libm-2.11.2.so ..
  --30287-- .. CRC 不匹配(计算 dd5c85df 需要 ccd85fcf)
  --30287-- 考虑 /usr/lib/debug/lib/libm-2.11.2.so ..
  --30287-- .. CRC 有效
  --30287-- 从 /lib/libc-2.11.2.so (0x50ab000) 读取 sym
  --30287-- 考虑 /lib/libc-2.11.2.so ..
  --30287-- .. CRC 不匹配(计算 7d8e8f4f 想要 9b015f2c)
  --30287-- 考虑 /usr/lib/debug/lib/libc-2.11.2.so ..
  --30287-- .. CRC 有效
  --30287-- REDIR: 0x5128600 (__GI_strrchr) 重定向到 0x4c25280 (__GI_strrchr)
  --30287-- REDIR: 0x51218c0 (malloc) 重定向到 0x4c24466 (malloc)
  --30287-- REDIR: 0x5128d00 (memchr) 重定向到 0x4c25ed0 (memchr)
  --30287-- REDIR: 0x512a750 (memcpy) 重定向到 0x4c25f00 (memcpy)
  --30287-- REDIR: 0x5126b10 (strlen) 重定向到 0x4a205ac (_vgnU_ifunc_wrapper)
   ==30287== 警告:新重定向与现有重定向冲突——忽略它
  --30287-- 新:0x05126b40 (__GI_strlen) R-> 0x04c257f0 strlen
  --30287-- REDIR: 0x5126b40 (__GI_strlen) 重定向到 0x4c25810 (__GI_strlen)
  --30287-- REDIR: 0x512baf0 (__GI___rawmemchr) 重定向到 0x4c26ba0 (__GI___rawmemchr)
  --30287-- REDIR:0x51217e0(免费)重定向到 0x4c24076(免费)
   以下是存在的键及其对应的值
  --30287-- REDIR: 0x512bb40 (strchrnul) 重定向到 0x4c26b50 (strchrnul)

【问题讨论】:

    标签: c memory memory-management memory-leaks valgrind


    【解决方案1】:

    在 x86 主机上,valgrind 输出这样的行: For counts of detected and suppressed errors, rerun with: -v 所以像这样运行你的程序:valgrind -v ./myprog.

    【讨论】:

    • 嗨,我也用你提到的命令重新运行,但找不到那些被抑制的错误。
    • 首先在你的 valgrind .supp 文件 (find / -type f -name "default.supp") 中查找 valgrind 输出中列出的抑制 - 名称如 dl-hack3-cond-1。接下来,阅读:valgrind.org/docs/manual/mc-manual.html#mc-manual.suppfiles。还要注意@Jens 所说的内容。
    【解决方案2】:

    被抑制的错误只是系统特定的错误,是您的库的已知问题。因此,他们不是另一个系统的可移植性问题的正确嫌疑人。

    【讨论】:

    • 您认为便携性问题的其他原因是什么?我在移植时也解决了类型转换问题。您是否认为有时 valgrind 也会提供虚假信息?我使用 valgrind --leak-check=full ./executable file_name 来检查内存泄漏。
    • 您对遇到的可移植性问题的类型只字未提。我们应该如何知道原因?
    【解决方案3】:

    您可以在/usr/lib/valgrind/default.supp 中查看/修改被抑制的错误。

    【讨论】:

    • 我检查了您在此处提到的那个,但看不到任何明确提及错误的词。你有什么想法,如果错误中指定了任何关键字,以便我可以追踪这些?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多