当我发现它仅适用于Linux时,我正在研究Valgrind以帮助改进我的C编码/调试 - 我没有其他需要或兴趣将我的操作系统转移到Linux所以我想知道是否有一个同样好的Windows程序.
所以我一直在从valgrind那里得到一些神秘的未初始化的价值信息,这一直是神秘的,因为坏的价值源于何处.
似乎valgrind显示了最终使用的单位化值的位置,而不是未初始化值的来源.
==11366== Conditional jump or move depends on uninitialised value(s)
==11366== at 0x43CAE4F: __printf_fp (in /lib/tls/i686/cmov/libc-2.7.so)
==11366== by 0x43C6563: vfprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366== by 0x43EAC03: vsnprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366== by 0x42D475B: (within /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x42E2C9B: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const (in /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x42E31B4: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, double) const (in /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x42EE56F: std::ostream& std::ostream::_M_insert<double>(double) (in /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x81109ED: …
Run Code Online (Sandbox Code Playgroud) 该块中提到的所有功能都是库函数.我怎样才能纠正这个内存泄漏?
它列在" 仍可达 "类别下.(还有4个,非常相似,但尺寸各异)
630 bytes in 1 blocks are still reachable in loss record 5 of 5
at 0x4004F1B: calloc (vg_replace_malloc.c:418)
by 0x931CD2: _dl_new_object (dl-object.c:52)
by 0x92DD36: _dl_map_object_from_fd (dl-load.c:972)
by 0x92EFB6: _dl_map_object (dl-load.c:2251)
by 0x939F1B: dl_open_worker (dl-open.c:255)
by 0x935965: _dl_catch_error (dl-error.c:178)
by 0x9399C5: _dl_open (dl-open.c:584)
by 0xA64E31: do_dlopen (dl-libc.c:86)
by 0x935965: _dl_catch_error (dl-error.c:178)
by 0xA64FF4: __libc_dlopen_mode (dl-libc.c:47)
by 0xAE6086: pthread_cancel_init (unwind-forcedunwind.c:53)
by 0xAE61FC: _Unwind_ForcedUnwind (unwind-forcedunwind.c:126)
Run Code Online (Sandbox Code Playgroud)
Catch:一旦我运行我的程序,它没有内存泄漏,但它在Valgrind输出中有一个额外的行,之前没有出现:
由于munmap()而丢弃/lib/libgcc_s-4.4.4-20100630.so.1中的0x5296fa0-0x52af438处的syms
如果泄漏无法纠正,有人可以解释为什么munmap()行导致Valgrind报告0"仍然可达"泄漏?
编辑:
这是一个最小的测试样本:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *runner(void …
Run Code Online (Sandbox Code Playgroud) 在使用Valgrind工具时,我需要记录valgrind工具生成的详细信息.我怎么能做到这一点?我尝试过类似的东西,
valgrind a.out | test
Run Code Online (Sandbox Code Playgroud)
和
valgrind a.out > test
Run Code Online (Sandbox Code Playgroud)
它只给出了程序的输出而不是valgrind内存错误,泄漏信息.如果程序不需要用户交互(即提供输入),即使我是这样的.如果程序需要用户输入,即使该东西本身也不起作用.
我怎样才能做到这一点?
如何使用valgrind查找程序中的内存泄漏?
请有人帮助我并描述执行程序的步骤?
我正在使用Ubuntu 10.04,我有一个程序a.c
,请帮帮我.
你能告诉我如何在优胜美地上安装valgrind吗?当我尝试安装它时,我得到"检查内核版本...不支持(14.0.0)configure:错误:Valgrind适用于Darwin 10.x,11.x,12.x和13.x(Mac OS X) 10.6/7/8/9)"
没有官方路径或更新,我没有找到任何东西(除了http://comments.gmane.org/gmane.comp.kde.devel.bugs/1553705,但他们没有解决这个问题).
当我对valgrind运行我的程序时,我遇到了以下警告.
Warning: set address range perms: large range [0x4d59d040, 0x6159d040) (undefined)
Warning: set address range perms: large range [0x194f7030, 0x2d4f7050) (noaccess)
Warning: set address range perms: large range [0x3959d030, 0x6159d050) (noaccess)
Run Code Online (Sandbox Code Playgroud)
经过一些谷歌搜索后,我在这里发现它是一个Diagnostic message, mostly for benefit of the Valgrind developers, to do with memory permissions
,这并没有告诉我多少.
我的程序确实在堆上分配了大量内存.(一堆之后可以达到2-3 GB的ram realloc
)
但是,尽管没有任何分配失败,但警告仍然出现.
那么,我想知道这个消息到底意味着什么?我没有某种内存许可?(但分配成功)
我正在使用Valgrind 3.3.1和Massif工具来分析C++应用程序的堆,我想知道是否有一个图形工具来检查文本输出文件.
谢谢你的任何建议.
我们的代码涉及一个POD(Plain Old Datastructure)结构(它是一个基本的c ++结构,其中包含其他结构和POD变量,需要在开始时进行初始化.)
根据我所读到的,似乎:
myStruct = (MyStruct*)calloc(1, sizeof(MyStruct));
Run Code Online (Sandbox Code Playgroud)
应该将所有值初始化为零,如下所示:
myStruct = new MyStruct();
Run Code Online (Sandbox Code Playgroud)
但是,当以第二种方式初始化结构时,Valgrind后来抱怨"当使用这些变量时,条件跳转或移动取决于未初始化的值".我的理解是否存在缺陷,或者Valgrind是否会误报?