我有一组每晚运行的验收测试。我想使用 valgrind 自动检查代码中的内存泄漏,作为手动检查泄漏的额外保护措施。更新我的脚本以在 valgrind 下运行我的进程是微不足道的,但是,每个测试都会启动和停止许多进程,并且有大约 15000 个测试用例,所以我最终会得到数千个单独的报告。
是否有能够合并这些报告的工具?我见过 valkyrie,但根据文档他们不支持 valgrind 3.5
PostgreSQL 大量使用内存池,并且在启用 Valgrind 时,使用VALGRIND_CREATE_MEMPOOL等将有关它们的信息提供给 Valgrind 。
结合使用客户端请求的增量泄漏检查VALGRIND_DO_LEAK_CHECK,VALGRIND_DO_ADDED_LEAK_CHECK这对于跟踪大型、复杂和长期存在的程序中的内存使用情况非常有用。
但是:PostgreSQL 有很多缓存,它们的生命周期往往跨越典型的边界,比如事务。此类缓存中的内存出现泄漏通常是正常的(出于各种原因),但如果仅使用堆栈在缓存上下文中分配此类内存,则并不总是容易识别。
因此,我正在寻找一种在泄漏报告中显示内存池名称并在抑制中对其进行过滤的方法。理想情况下像
# Do not copy, this DOES NOT WORK
{
my_suppression_name
Memcheck:Leak
match-leak-kinds: reachable
pool:CacheMemoryContext # <---- something like this
fun:malloc
fun:AllocSetAlloc
fun:palloc
fun:initStringInfo
fun:apply_work
...
}
Run Code Online (Sandbox Code Playgroud)
或在泄漏报告中,如下所示:
... 6 (+6) bytes in 1 (+1) blocks are possibly lost in loss record 180 of 942
... in mempool "CacheMemoryContext" <---- Like this
... at 0x815FFC: MemoryContextAlloc (mcxt.c:771)
... by 0x817680: MemoryContextStrdup (mcxt.c:1157)
Run Code Online (Sandbox Code Playgroud)
我怀疑答案是否定的,因为注册 …
如果您使用过Memcheck(来自Valgrind),您可能会熟悉这条消息......
条件跳转或移动取决于未初始化的值
我已经读过这个,当你使用未初始化的值时,它就会发生.
MyClass s;
s.DoStuff();
Run Code Online (Sandbox Code Playgroud)
这样可以工作,因为它s是自动初始化的...所以如果是这样的话,它可以工作,为什么Memcheck告诉我它没有初始化?信息应该被忽略吗?
也许我误解了错误指示我的位置.从Valgrind手册中,实际的错误片段是......
int main()
{
int x;
printf ("x = %d\n", x);
}
Run Code Online (Sandbox Code Playgroud)
但是,在我的代码中,我看不到类似的东西.我注意到,堆栈顶部的函数跟踪Memcheck显示我是一个虚函数; 这可能与它有关吗?
==14446== Conditional jump or move depends on uninitialised value(s)
==14446== at 0x414164: vimrid::glut::GlutApplication::FinishRender() (GlutApplication.cpp:120)
==14446== by 0x422434: vimrid::demos::filterdemos::FilterDemo3::Render() (FilterDemo3.cpp:260)
==14446== by 0x412D3D: vimrid::VimridApplication::UpdateAndRender() (VimridApplication.cpp:93)
==14446== by 0x4144BA: vimrid::glut::GlutApplication::glutHandleDisplay() (GlutApplication.cpp:201)
==14446== by 0x41486A: vimrid::glut::GlutApplication::glutCallbackDisplay() (GlutApplication.cpp:277)
==14446== by 0x54D9FAA: (within /usr/lib64/libglut.so.3.8.0)
==14446== by 0x54DDA4A: fgEnumWindows (in /usr/lib64/libglut.so.3.8.0)
==14446== by 0x54DA4A3: glutMainLoopEvent (in /usr/lib64/libglut.so.3.8.0)
==14446== by 0x54DAEB5: glutMainLoop (in /usr/lib64/libglut.so.3.8.0) …Run Code Online (Sandbox Code Playgroud) 我正在为课堂上的实验编写代码,这是使用循环链表进行 OOD 设计的练习。这仅意味着我无法访问所使用的一些关键功能。然而,我最困惑的是,虽然我的驱动程序模仿了教授写的驱动程序,但我仍然在标题中收到 mchk 错误。这是它引用的代码
{
int nNodesFreed{0};
node* n{head};
for(; n!= head || ! nNodesFreed; n = n->next) {
delete n;
nNodesFreed++;
}
cout << "# nodes freed: " << nNodesFreed << endl;
}
Run Code Online (Sandbox Code Playgroud)
我在类似的问题中看到问题可能是我正在尝试访问已释放的内存。即,如果 n 不再存在,那么 n = n->next 又如何呢?我尝试使用当前指针和下一个指针切换到 while 循环,但这使问题变得更糟。该代码在我教授的作业版本中完美运行,其中我尚未实现我需要的功能。
我得到的确切错误是:
Invalid read of size 8
at 0x400D8A: main (lab04.cpp:28) // this references the for loop
Address 0x5a02048 is 8 bytes inside a block of size 16 free'd
at 0x4C28FAC: operator delete(void*)
by 0x400D81: main (lab04.cpp:29) …Run Code Online (Sandbox Code Playgroud) 如何在不通过 valgrind 命令选项启动它的情况下对 Process 的每个实例进行 valgrind memcheck。
有没有办法将监控选项保存在进程中,而不是每次都使用 valgrind 命令启动进程?
在 Microsoft Application Verifier 中,如果指定要监视某个应用程序,则该应用程序的任意数量的实例都会受到监视,无论其是子进程还是以其他方式启动。
有什么想法可以在 Valgrind 中做同样的事情吗?
我已经尝试了 valgrind memcheck 的 --trace-children=yes 选项......但我的应用程序 xyz 向另一个应用程序 zzz 发出信号以启动一个新的 xyz(process) 实例,我想分析它。在这种情况下,valgrind 在 xyz 完成 zzz 信号时退出。它没有跟进 zzz 启动的进程。
谢谢,维杰
Valgrind在我的代码中给出了以下泄漏摘要.但是,我释放了所有的malloc'ed内存.这是件坏事还是这是正常的?我的节目是在c.
== 3513 ==泄漏摘要:
== 3513 ==绝对丢失:0个块中的0个字节.
== 3513 ==可能丢失:0个块中的0个字节.
== 3513 ==仍然可以访问:1个块中的568个字节.
== 3513 ==抑制:0个块中的0个字节.
我在一个(愚蠢的)身份验证模块上找到了valgrind发现的这个奇怪的错误,它在堆分配上做了一些.
==8009== Invalid free() / delete / delete[] / realloc()
==8009== at 0x4C2A739: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8009== by 0x40263F: authenticate (server_utils.c:109)
==8009== by 0x401A27: main (server.c:240)
==8009== Address 0x51f1310 is 0 bytes inside a block of size 18 free'd
==8009== at 0x4C2A739: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8009== by 0x402633: authenticate (server_utils.c:108)
==8009== by 0x401A27: main (server.c:240)
=8009==
==8009== Invalid free() / delete / delete[] / realloc()
==8009== at 0x4C2A739: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8009== by 0x40264B: authenticate (server_utils.c:110)
==8009== by 0x401A27: main …Run Code Online (Sandbox Code Playgroud) 我想从命令行使用 ctest 用 memcheck 运行我的测试并传入 memcheck 命令的参数。
我可以运行ctest -R my_test来运行我的测试,我什ctest -R my_test -T memcheck至可以通过 memcheck运行来运行它。
但我似乎无法找到一种方法将参数传递给该 memcheck 命令,例如--leak-check=full或--suppressions=/path/to/file。
在阅读了 ctest 的文档后,我尝试将-D选项与CTEST_MEMCHECK_COMMAND_OPTIONS和 一起使用MEMCHECK_COMMAND_OPTIONS。我也尝试将这些设置为环境变量。我的尝试都没有产生任何不同的测试命令。总是如此:
Memory check command: /path/to/valgrind "--log-file=/path/to/build/Testing/Temporary/MemoryChecker.7.log" "-q" "--tool=memcheck" "--leak-check=yes" "--show-reachable=yes" "--num-callers=50"
Run Code Online (Sandbox Code Playgroud)
如何从 ctest 命令行控制 memcheck 命令?
我之前没有使用过 valgrind,但我认为它应该可以检测到一些内存错误。
我的代码:
#include <stdio.h>
unsigned int a[2];
int main()
{
a[-1] = 21;
printf("%d,", a[-1]);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在访问a[-1]我不应该访问的内容。
我如何使用 valgrind?
我正在编译 gcc -g -O0 codeFile.c
并执行: valgrind -s ./a.out
结果是:
==239== Memcheck,一个内存错误检测器
==239== 版权所有 (C) 2002-2017,以及 GNU GPL,由 Julian Seward 等人所有。
==239== 使用 Valgrind-3.16.0.GIT 和 LibVEX;使用 -h 重新运行以获取版权信息
==239== 命令:./a.out
==239== 21,==239==
==239== 堆摘要:
==239== 退出时正在使用:0 个块中的 0 个字节
==239== 总堆使用量:1 次分配,1 次释放,已分配 1,024 字节
==239==
==239== 所有堆块都被释放——不可能有泄漏
==239==
==239== 错误摘要:来自 0 个上下文的 0 个错误(禁止:来自 0 …
memcheck ×9
valgrind ×8
c ×4
c++ ×3
memory-leaks ×3
cmake ×1
command-line ×1
ctest ×1
free ×1
linked-list ×1
postgresql ×1