问题标签 [memcheck]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
valgrind - 抑制特定分叉子项的泄漏检查
从实用程序派生的子进程退出时,通常不可能释放所有内存。我想在库中抑制对这些的内存泄漏检测。
我不想让使用该库的开发人员--show-leak-kinds=all
不得不查看来自子进程的泄漏报告,因为没有人可以真正对它们做任何事情。
我知道--child-silent-after-fork=yes
命令行可用于禁止所有分叉进程的报告,但这也可能禁止来自主应用程序的报告,并要求用户记住始终指定此选项。
一个非常常见的问题是在使用 fork/exec 的代码中,当触发错误路径时需要终止子进程而不执行目标可执行文件(可能某些设置失败或可执行文件毕竟不是可执行文件) . 其他用例可能包括寿命更长的辅助进程(例如在 pulseaudio 或类似代码出现之前来自 alsa 的 dmix 进程)。
由于这应该对开发人员友好,因此我正在寻找可以在库中实现而无需手动将参数添加到 valgrind 调用的解决方案。可能的解决方案可能包括使用客户端请求、使用客户端请求监控命令或智能编码。
最小的例子:
我想something_that_forks 在某个图书馆里。我正在寻找一种方法来修改它,以便 valgrind 不会报告子进程中的泄漏。当然,库对其他组件在主程序中的分配一无所知。
valgrind - 更多 Memcheck 上下文行
在程序运行的最后,“leak check full”“show leak kinds all”以这样的部分的形式显示了一些泄漏事件,仅作为示例:
最顶层的范围是main
,并且在多个块中,就像这个一样,有足够的深度,调用堆栈不会显示到main
. 在其他事件中,有足够的上下文来显示每个级别。
我已经看到,在这个主机中,这里只显示了 12 个级别(vg_replace_malloc.c
然后是我的 11 个用户级别)。
这可以配置为显示超过 12 个级别吗?
我读过 Valgrind 的论点,Memcheck 的论点,增加了冗长,但没有成功。
c - Memcheck 在有限的堆大小下 C 程序的内存行为
我写了一段 C 代码,它一个接一个地动态分配一些结构。当任何分配失败时,必须释放一些先前分配的分配。虽然我能够在每次分配成功时成功地对应用程序进行memcheck,但我无法弄清楚如何使用valgrind 的 memcheck来检查任何分配失败时的场景。
当尝试在外部施加内存限制以使分配失败时,例如使用ulimit或虚拟机,该限制也会施加到valgrind,结果会失败。使用qemu之类的工具会使可执行文件的内存行为对valgrind不可见,并且只分析工具的行为。
当尝试使用rlimit结构将其强加到代码中时,当程序单独执行并且分配按预期失败时,它被成功强加,当由 valgrind 运行时,它被忽略并且无论其值如何分配都会成功。
理想的情况是valgrind允许内存限制,但似乎不存在这样的选项。关于如何针对这种内存有限的场景进行内存检查的任何建议?
valgrind - Memcheck 中的最大详细程度?
根据我的实验,在我看来,Valgrind 的 Memcheck 中最远的最大有意义的冗长是两个--verbose
标志1。
真的吗?
1:允许使用三个或更多的 `--verbose` 标志,但我认为它们不会对输出产生重大影响。
c - 为什么 valgrind memcheck 没有发现错误?
我以前没有使用过 valgrind,但我认为它应该检测到一些内存错误。
我的代码:
如您所见,我正在访问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 个来自 0)
valgrind 不应该发现这些错误,还是我用错了?
[ _ -10] 而不是 [1]。相同的行为。
如果我使用 [-100] 它实际上会引发错误。这是怎么回事?
编辑 2
此外,为什么这没有错误
但这确实
qt - QTCreator Memcheck 在不让我运行实际程序的情况下执行分析?
我正在尝试使用 QTCreator 的 Memcheck 工具来分析 QT 项目的内存,这是一个动态库。它使用 QT Gui (QMainWindow) 允许用户选择一个文件,然后处理该文件,然后最终返回到主窗口。
但是,我似乎无法正确使用 Memcheck。
当我选择“Memcheck”并点击运行时,它会立即进入“分析内存”,而不会让 Gui 弹出。
这是有问题的。我怎样才能让 memcheck 与这个程序一起工作?
c++ - Valgrind memcheck - 得到???而不是方法名
我正在运行 valgrind/memcheck,试图识别导致无法解释的分段错误的潜在内存泄漏。
日志显示???而不是方法名,所以调用堆栈是没用的。所有代码(库和可执行文件)都使用调试信息进行编译。
例子:
valgrind 命令是:
valgrind/3.7.0/bin/valgrind --tool=memcheck -q --log-file=/proj/users/ae/valgrind.txt --trace-children=no --child-silent-after-fork=yes --run-libc-freeres=yes --demangle=yes --num-callers=12 --error-limit=no --show-below-main=no --max-stackframe=2000000 --fullpath-after= --leak-check=yes --show-reachable=no --leak-resolution=high --freelist-vol=10000000 --workaround-gcc296-bugs=no --partial-loads-ok=no --undef-值错误=是 /proj/users/ae/mxx/build/Debug/bin/mxx
谢谢
valgrind - 是否可以在 valgrind 中设置基线内存使用量以进行泄漏检测?
有没有办法从我的代码中告诉 valgrind 何时开始以及何时停止检查内存泄漏?
我正在使用一个遗留测试框架,它必须与我的测试程序链接才能运行。该框架存在内存泄漏 - valgrind 显示大约 50KB 的内存尚未释放,但可以通过启发式访问。这很烦人,因为我必须记住这个数字才能查看我的代码泄漏了多少内存。如果我可以告诉 valgrind 在我的第一次测试开始时开始收集内存统计信息,并在最后一次测试结束时停止收集,那将会方便得多。有它的API吗?
c - memcheck 错误是否可以接受?
试着让你的程序干净到 Memcheck 不会报告任何错误。一旦你达到了这个状态,就更容易看到程序的更改何时导致 Memcheck 报告新的错误。多年使用 Memcheck 的经验表明,即使是大型程序也可以以干净的方式运行 Memcheck。例如,KDE、OpenOffice.org 和 Firefox 的大部分都是 Memcheck-clean,或者非常接近它。
这个块让我有点困惑。鉴于 C 标准的工作方式,我会假设大多数(如果不是全部)产生 memcheck 错误的做法会在程序上调用未定义的行为,因此应该像瘟疫一样避免。
然而,引用块中的最后一句话暗示实际上有“著名”程序在生产环境中运行,但存在 memcheck 错误。读完这篇文章后,我想我应该对此进行测试,并尝试使用 valgrind 运行 VLC,在启动它后立即收到一堆 memcheck 错误。
这让我想到了这个问题:是否有充分的理由不从生产程序中消除此类错误?发布包含此类错误的程序是否有任何好处?如果是,开发人员如何确保它的安全,尽管据我所知,包含此类错误的程序可能会发生不可预测的行为并且没有办法对其一般行为做出假设?如果是这样,您能否提供真实世界的示例,说明程序在出现这些错误时比没有错误时更好?
c - 条件跳转或移动取决于 strcpy 处的未初始化值
strcpy
Valgrind在以下代码中检测到问题:
代码似乎编译得很好,所以我认为这不是 mallocing 的问题。