GoGPT Best VPN GoSearch

OnWorks 网站图标

valgrind - 云端在线

通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器在 OnWorks 免费托管服务提供商中运行 valgrind

这是 valgrind 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


valgrind - 一套用于调试和分析程序的工具

概要


瓦尔格林德 [valgrind 选项[你的程序[你的程序选项]

商品描述


瓦尔格朗德 是一个灵活的程序,用于调试和分析 Linux 可执行文件。 它包含
一个内核,它在软件中提供了一个合成 CPU,以及一系列的调试和
分析工具。 该架构是模块化的,因此可以轻松创建新工具
在不破坏现有结构的情况下。

下面描述的一些选项适用于所有 Valgrind 工具,有些仅适用于
几个或一个。 MEMCHECK OPTIONS 部分及其下面的部分描述了特定于工具的
选项​​。

本手册页仅涵盖基本用法和选项。 如需更全面的信息,
请参阅您系统上的 HTML 文档:
$INSTALL/share/doc/valgrind/html/index.html,或在线:
http://www.valgrind.org/docs/manual/index.html.

工具 选择 配置


唯一最重要的选项。

--工具= [默认: 内存检查]
运行名为的 Valgrind 工具 工具名,例如 memcheck、cachegrind、callgrind、helgrind、
drd、massif、lakey、none、exp-sgcheck、exp-bbv、exp-dhat 等。

基础课程 配置


这些选项适用于所有工具。

-h - 帮帮我
显示所有选项的帮助,包括核心和所选工具。 如果选项
重复它相当于给 --help-调试.

--help-调试
与...一样 - 帮帮我, 但也列出了通常只用于
Valgrind 的开发人员。

- 版
显示 Valgrind 核心的版本号。 工具可以有自己的版本
数字。 有一个计划可以确保工具仅在核心
版本是他们已知使用的版本。 这样做是为了尽量减少
由工具与核心版本不兼容引起的奇怪问题。

-q, - 安静的
静默运行,仅打印错误消息。 如果您正在运行回归很有用
测试或拥有其他一些自动化测试机器。

-v, --详细
再详细点。 提供有关程序各个方面的额外信息,例如:
加载的共享对象、使用的抑制、检测的进度
和执行引擎,以及有关异常行为的警告。 重复选项
增加详细程度。

--trace-children= [默认: 不]
启用后,Valgrind 将跟踪通过 EXEC 系统
称呼。 这对于多进程程序是必要的。

请注意,Valgrind 确实会追踪到 (很难不,
制作一个相同的进程副本),所以这个选项可以说是很糟糕的
命名。 然而,大多数孩子 立即致电 EXEC 反正。

--trace-children-skip=patt1,patt2,...
此选项仅在以下情况下有效 --trace-children=是 被指定。 它允许
有些孩子要跳过。 该选项采用逗号分隔的模式列表
Valgrind 不应追踪到的子可执行文件的名称。 模式可能
包括元字符? 和 *,具有通常的含义。

这对于从正在处理的进程树中修剪无趣的分支很有用
在 Valgrind 上运行。 但是在使用时要小心。 当 Valgrind 跳过跟踪时
进入可执行文件,它不仅跳过跟踪该可执行文件,还跳过
跟踪该可执行文件的任何子进程。 换句话说,国旗没有
仅仅导致跟踪在指定的可执行文件处停止——它跳过跟踪
以任何指定的可执行文件为根的整个进程子树。

--trace-children-skip-by-arg=patt1,patt2,...
这和 --trace-children-skip,有一个区别:决定
是否跟踪子进程是通过检查子进程的参数来确定的
进程,而不是其可执行文件的名称。

--child-silent-after-fork= [默认: 不]
启用后,Valgrind 不会为子进程显示任何调试或日志输出
产生的过程 称呼。 这可以使输出不那么混乱(尽管
更具误导性)在处理创建子进程的过程时。 特别是
结合使用很有用 --跟踪儿童=. 使用此选项也强烈
如果您请求 XML 输出(--xml=是),否则来自的 XML
child 和 parent 可能会混淆,这通常使其无用。

--vgdb= [默认: 是的]
Valgrind 将在以下情况下提供“gdbserver”功能 --vgdb=是 or --vgdb=满 is
指定的。 这允许外部 GNU GDB 调试器来控制和调试您的程序
当它在 Valgrind 上运行时。 --vgdb=满 会导致显着的性能开销,但
提供更精确的断点和观察点。 请参阅使用调试您的程序
Valgrind 的 gdbserver 和 GDB 有详细说明。

如果启用了嵌入式 gdbserver 但当前没有使用 gdb,则 vgdb
命令行实用程序可以从 shell 向 Valgrind 发送“监视命令”。 这
Valgrind 核心提供了一组 Valgrind 监控命令。 一个工具可以选择
提供工具特定的监视器命令,这些命令记录在工具特定的
章。

--vgdb-错误= [默认: 999999999]
当 Valgrind gdbserver 启用时使用此选项 --vgdb=是 or --vgdb=满.
报告错误的工具会在冻结之前等待报告“数字”错误
程序并等待您与 GDB 连接。 因此,零值
将导致 gdbserver 在您的程序执行之前启动。 这是
通常用于在执行前插入 GDB 断点,也适用于工具
不报告错误的,例如 Massif。

--vgdb-stop-at= [默认: 没有任何]
当 Valgrind gdbserver 启用时使用此选项 --vgdb=是 or --vgdb=满.
Valgrind gdbserver 将在每个错误之后被调用 --vgdb-错误
报道。 您还可以要求其他调用 Valgrind gdbserver
事件,以下列方式之一指定:

· 一个或多个逗号分隔的列表 启动 出口 缬格林达贝西.

价值 启动 出口 缬格林达贝西 分别表示调用gdbserver
在程序执行之前,在程序的最后一条指令之后,在
Valgrind 异常退出(例如内部错误,内存不足,...)。

请注意: 启动--vgdb-错误=0 都会导致调用 Valgrind gdbserver
在你的程序执行之前。 这 --vgdb-错误=0 还会导致您的
程序停止所有后续错误。

· 所有 指定完整的集合。 它相当于
--vgdb-stop-at=启动、退出、valgrindabexit.

· 没有 为空集。

--track-fds= [默认: 不]
启用后,Valgrind 将在退出或启动时打印出打开的文件描述符列表
请求,通过 gdbserver monitor 命令 诉状 open_fds. 随着每个文件
描述符打印文件打开位置的堆栈回溯以及任何详细信息
与文件描述符相关,例如文件名或套接字详细信息。

--时间戳= [默认: 不]
启用后,每条消息前面都会显示经过的挂钟
自启动以来的时间,以天、小时、分钟、秒和毫秒表示。

--log-fd= [默认: 2, 标准错误]
指定 Valgrind 应将其所有消息发送到指定文件
描述符。 默认值 2 是标准错误通道 (stderr)。 请注意,这可能
干扰客户自己对标准错误的使用,因为 Valgrind 的输出将是
与客户端发送到 stderr 的任何输出交错。

--日志文件=
指定 Valgrind 应将其所有消息发送到指定文件。 如果
文件名是空的,它会导致中止。 有三个特殊的格式说明符
可以在文件名中使用。

%p 替换为当前进程 ID。 这对于程序非常有用
调用多个进程。 警告:如果您使用 --trace-children=是 和你的程序
调用多个进程或您的程序分叉后不调用 exec ,并且
您不使用此说明符(或 %q 下面的说明符),所有的 Valgrind 输出
这些进程将进入一个文件,可能会混乱,可能不完整。

%q{FOO} 替换为环境变量的内容 FOO。 如果 {FOO}
部分格式错误,会导致中止。 很少需要此说明符,但非常需要
在某些情况下很有用(例如,在运行 MPI 程序时)。 这个想法是你
指定一个变量,该变量将为作业中的每个进程设置不同的值,例如
例如 BPROC_RANK 或任何适用于您的 MPI 设置的内容。 如果命名
未设置环境变量,它会导致中止。 请注意,在某些 shell 中, {
} 字符可能需要用反斜杠转义。

%% 被替换为 %.

如果 % 后跟任何其他字符,它会导致中止。

如果文件名指定了相对文件名,则放在程序的初始
工作目录:这是程序启动时的当前目录
在 fork 或 exec 之后执行。 如果它指定了一个绝对文件名(即。
以“/”开头)然后放在那里。

--log-socket=
指定 Valgrind 应将其所有消息发送到指定端口
指定的 IP 地址。 可以省略端口,在这种情况下使用端口 1500。 如果一个
无法连接到指定的套接字,Valgrind 回退到写入
输出到标准错误 (stderr)。 此选项旨在用于
与 valgrind-listener 程序结合使用。 有关更多详细信息,请参阅
手册中的注释。

错误相关 配置


所有可以报告错误的工具都使用这些选项,例如 Memcheck,但不
缓存研磨。

--xml= [默认: 不]
启用后,输出的重要部分(例如工具错误消息)将在
XML 格式而不是纯文本。 此外,XML 输出将发送到
与纯文本输出不同的输出通道。 因此,您还必须使用一个
of --xml-fd, --xml文件 or --xml 套接字 指定要发送 XML 的位置。

不太重要的消息仍将以纯文本形式打印,但因为 XML
输出和纯文本输出被发送到不同的输出通道(目标
纯文本输出仍然由控制 --log-fd, --日志文件--日志套接字)
这应该不会造成问题。

此选项旨在使消耗 Valgrind 输出的工具的生活更轻松
输入,例如 GUI 前端。 目前此选项适用于 Memcheck、Helgrind、
DRD 和 SGcheck。 输出格式在文件中指定
Valgrind 4 的源代码树中的 docs/internals/xml-output-protocol3.5.0.txt 或
后来。

当请求 XML 输出时,推荐的 GUI 选项是: --xml=是
启用 XML 输出, --xml文件 将 XML 输出发送到(大概是 GUI 选择的)
文件, --日志文件 将纯文本输出发送到第二个 GUI 选择的文件,
--child-silent-after-fork=是-q 将纯文本输出限制为关键
Valgrind 本身创建的错误消息。 例如,无法读取指定的
抑制文件计为严重错误消息。 这样,对于一个成功的
运行文本输出文件将为空。 但如果它不为空,那么它将包含
GUI 用户应该知道的重要信息。

--xml-fd= [默认: - 1, 已禁用]
指定 Valgrind 应将其 XML 输出发送到指定的文件描述符。
它必须与 --xml=是.

--xml-文件=
指定 Valgrind 应将其 XML 输出发送到指定的文件。 肯定是
结合使用 --xml=是。 任何 %p or %q 出现在文件名中的序列
以与它们完全相同的方式扩展 --日志文件. 看说明
of --日志文件 了解详情。

--xml-socket=
指定 Valgrind 应将其 XML 输出发送到指定端口的指定端口
IP地址。 它必须与 --xml=是. 论证的形式是
与使用的相同 --日志套接字. 见说明 --日志套接字 为了更进一步的
细节。

--xml-user-comment=
在 XML 输出的开头嵌入额外的用户注释字符串。 仅当
--xml=是 已指明; 否则忽略。

--demangle= [默认: 是的]
启用/禁用 C++ 名称的自动分解(解码)。 默认启用。 什么时候
启用,Valgrind 将尝试将编码的 C++ 名称转换回某些内容
接近原作。 demangler 处理由 g++ 版本 2.X 修改的符号,
3.X 和 4.X。

关于解压的一个重要事实是抑制中提到的函数名称
文件应该是经过修改的形式。 Valgrind 在以下情况下不会破坏函数名称
寻找适用的抑制,因为否则会抑制
文件内容取决于 Valgrind 的拆解机器的状态,而且速度也很慢
向下抑制匹配。

--num-callers= [默认: 12]
指定标识程序的堆栈跟踪中显示的最大条目数
地点。 请注意,错误仅使用前四个函数位置共同出现
(当前函数中的位置,以及它的三个直接调用者的位置)。 所以这
不会影响报告的错误总数。

最大值为 500。请注意,更高的设置将使 Valgrind 运行
慢一点并占用更多内存,但在使用时可能很有用
具有深度嵌套调用链的程序。

--unw-stack-scan-thresh= [默认: 0] , --unw-stack-scan-frames= [默认:
5]
堆栈扫描支持仅在 ARM 目标上可用。

这些标志通过堆栈扫描启用和控制堆栈展开。 当正常
堆栈展开机制——使用 Dwarf CFI 记录和帧指针跟随
-- 失败,堆栈扫描可能能够恢复堆栈跟踪。

请注意,堆栈扫描是一种不精确的启发式机制,可能会给
误导性的结果,或者根本没有。 它应该只在紧急情况下使用,在正常情况下
展开失败,但仍然有堆栈跟踪很重要。

堆栈扫描是一种简单的技术:展开器从堆栈中读取单词,然后
通过检查它们是否可能是返回地址,尝试猜测它们中的哪些可能是返回地址
点紧跟在 ARM 或 Thumb 调用指令之后。 如果是,则将该词添加到
回溯。

主要的危险发生在函数调用返回时,留下它的返回地址
暴露,并调用一个新函数,但新函数不会覆盖旧函数
地址。 这样做的结果是回溯可能包含函数的条目
已经返回了,所以很混乱。

此实现的第二个限制是它只会扫描页面(4KB,
通常)包含起始堆栈指针。 如果堆栈帧很大,这
可能导致跟踪中仅存在少数(或什至没有)。 另外,如果你
不幸的是,在其包含页面的末尾附近有一个初始堆栈指针,
扫描可能会错过所有有趣的帧。

默认情况下禁用堆栈扫描。 正常的用例是在
否则堆栈跟踪将非常短。 因此,要启用它,请使用
--unw-stack-scan-thresh=数字。 这要求 Valgrind 尝试使用堆栈扫描来
“扩展”包含少于数字帧的堆栈跟踪。

如果确实发生了堆栈扫描,它最多只会生成帧数
由 --unw-stack-scan-frames 指定。 通常,堆栈扫描会产生很多
默认情况下,此值设置为低值 (5) 的垃圾条目。 在任何情况下都不会
创建大于 --num-callers 指定值的堆栈跟踪。

--错误限制= [默认: 是的]
启用后,Valgrind 在总数达到 10,000,000 或 1,000 后停止报告错误
不同的,见过。 这是为了阻止错误跟踪机制
在有很多错误的程序中成为巨大的性能开销。

--error-exitcode= [默认: 0]
指定在 Valgrind 报告任何错误时返回的替代退出代码
跑。 当设置为默认值(零)时,Valgrind 的返回值将始终
是被模拟过程的返回值。 当设置为非零值时,即
如果 Valgrind 检测到任何错误,则返回值。 这对于使用很有用
Valgrind 作为自动化测试套件的一部分,因为它可以轻松检测测试
Valgrind 报告错误的情况,只需检查返回码即可。

--错误标记= , [默认: 没有任何]
当错误输出为纯文本(即不使用 XML)时, --错误标记 指示
输出一行包含 开始 ( end) 每个错误之前(之后)的字符串。

这样的标记线有助于搜索错误和/或提取错误
包含与程序输出混合的 valgrind 错误的输出文件。

请注意,接受空标记。 因此,仅使用开始(或结束)标记是
可能。

--sigill-诊断= [默认: 是的]
启用/禁用非法指令诊断的打印。 默认情况下启用,但
默认为禁用时 - 安静的 给出。 默认值总是可以明确的
通过提供此选项覆盖。

启用后,无论何时,都会打印警告消息以及一些诊断信息
遇到 Valgrind 无法解码或翻译的指令,在
程序被给予一个 SIGILL 信号。 通常,非法指令表明程序中存在错误
程序或缺少对 Valgrind 中特定指令的支持。 但一些
程序确实会故意尝试执行可能丢失并捕获的指令
用于检测处理器功能的 SIGILL 信号。 使用此标志可以
避免在这种情况下您会得到的诊断输出。

--show-below-main= [默认: 不]
默认情况下,错误的堆栈跟踪不显示出现在下方的任何函数
因为大多数时候它是无趣的 C 库内容和/或 gobbledygook。
或者,如果 堆栈跟踪中不存在,堆栈跟踪不会显示
以下任何功能 - 类似函数,例如 glibc 的 __libc_start_main.
此外,如果 - 类似函数存在于跟踪中,它们被标准化为
(下面 主要的),为了使输出更具确定性。

如果启用此选项,将显示所有堆栈跟踪条目并 -喜欢
功能不会正常化。

--fullpath-after= [默认: 显示 资源 路径]
默认情况下,Valgrind 只显示堆栈跟踪中的文件名,而不显示完整路径
源文件。 在源所在的大型项目中使用 Valgrind 时
多个不同的目录,这可能很不方便。 --之后的完整路径 提供了一个
灵活解决这个问题。 当这个选项存在时,每个路径
显示源文件,并带有以下非常重要的警告:如果 绳子 被发现于
路径,然后是直到并包括的路径 绳子 省略,否则显示路径
未修改。 注意 绳子 不需要是路径的前缀。

例如,考虑一个名为 /home/janedoe/blah/src/foo/bar/xyzzy.c 的文件。 指定
--fullpath-after=/home/janedoe/blah/src/ 将导致 Valgrind 将名称显示为
foo/bar/xyzzy.c。

因为字符串不需要是前缀, --fullpath-after=src/ 将产生
相同的输出。 当路径包含任意机器生成的
人物。 例如,路径 /my/build/dir/C32A1B47/blah/src/foo/xyzzy 可以是
修剪为 foo/xyzzy 使用 --fullpath-after=/blah/src/.

如果您只想查看完整路径,只需指定一个空字符串:
--fullpath-after= 后的完整路径. 这不是一个特例,只是一个逻辑结果
以上规则。

最后,您可以使用 --之后的完整路径 多次。 它的任何出现都会导致
Valgrind 切换到生成完整路径并应用上述过滤规则。 每个
生成的路径与所有路径进行比较 --之后的完整路径- 指定的字符串,在
指定的顺序。 要匹配的第一个字符串会导致路径被截断为
如上所述。 如果没有匹配项,则显示完整路径。 这有助于砍掉
当来源是从许多不相关的目录中提取时的前缀。

--extra-debuginfo-path= [默认: 未定义 没用过]
默认情况下,Valgrind 在几个众所周知的路径中搜索调试对象,例如
/usr/lib/调试/。

但是,在某些情况下,您可能希望将调试对象放在
任意位置,例如在移动设备上运行 Valgrind 时的外部存储
本地存储空间有限。 另一个例子可能是你没有的情况
在您运行的系统上安装调试对象包的权限
瓦尔格林。

在这些情况下,您可以提供一个绝对路径作为额外的最终位置
Valgrind 通过指定搜索调试对象
--extra-debuginfo-path=/路径/到/调试/对象. 给定的路径将被添加到
搜索对象的绝对路径名。 例如,如果 Valgrind 正在寻找
/w/x/y/zz.so 的调试信息和 --extra-debuginfo-path=/a/b/c 被指定,它将
在 /a/b/c/w/x/y/zz.so 中查找调试对象。

此标志应仅指定一次。 如果多次指定,则只有
最后一例受到尊重。

--debuginfo-server=ipaddr:端口 [默认: 未定义 没用过]
这是 3.9.0 版中引入的一项新的实验性功能。

在某些情况下,从存储在
不同的机器。 使用此标志,Valgrind 将查询运行在其上的调试信息服务器
ipaddr 并监听端口端口,如果在本地找不到 debuginfo 对象
文件系统。

debuginfo 服务器必须接受端口端口上的 TCP 连接。 调试信息服务器是
包含在源文件 auxprogs/valgrind-di-server.c 中。 它只会从
它启动的目录。端口在客户端和服务器中默认为 1500,如果
未标明。

如果 Valgrind 使用 debuginfo 服务器查找 /w/x/y/zz.so 的 debuginfo,它
将去除路径名组件并仅在服务器上请求 zz.so。 在
turn 将仅在其当前工作目录中查找匹配的 debuginfo 对象。

按照 Valgrind 的要求,调试信息数据以小片段 (8 KB) 的形式传输。
每个块都使用 LZO 进行压缩以减少传输时间。 实施有
已针对单级 802.11g (WiFi) 网络链接的最佳性能进行了调整。

请注意,使用 GNU debuglink CRC 检查匹配的主对象与调试对象
方案,即使在使用 debuginfo 服务器时也会执行。 要禁用此类检查,
您还需要指定 --allow-mismatched-debuginfo=yes。

默认情况下,Valgrind 构建系统将为目标构建 valgrind-di-server
平台,这几乎肯定不是您想要的。 到目前为止,我们一直无法
了解如何让 automake/autoconf 为构建平台构建它。 如果你想
要使用它,您必须使用顶部显示的命令手动重新编译它
auxprogs/valgrind-di-server.c。

--allow-mismatched-debuginfo=否|是 [不]
当从单独的 debuginfo 对象读取 debuginfo 时,Valgrind 默认会检查
使用 GNU debuglink 机制确保 main 和 debuginfo 对象匹配。 这个
保证它不会从过时的 debuginfo 对象中读取 debuginfo,并且
还确保 Valgrind 不会因不匹配而崩溃。

可以使用 --allow-mismatched-debuginfo=yes 覆盖此检查。 这可能是
当 debuginfo 和 main 对象没有以正确的方式拆分时很有用。 是
但是,在使用它时要小心:它会禁用所有一致性检查,而 Valgrind
当 main 和 debuginfo 对象不匹配时,已经观察到崩溃。

--suppressions= [默认: $PREFIX/lib/valgrind/default.supp]
指定一个额外的文件,从中读取要抑制的错误描述。 你可以
使用多达 100 个额外的抑制文件。

--gen-suppressions= [默认: 不]
设置为 , Valgrind 将在显示每个错误后暂停并打印以下行:

---- 打印抑制? --- [返回/N/n/Y/y/C/c] ----

压制 N or n , 导致 Valgrind 继续执行而不打印
抑制此错误。

压制 Y or y 导致 Valgrind 为这个错误写一个抑制。 你可以
如果您不想听到有关
未来的错误。

设置为 所有, Valgrind 将打印每个报告的错误的抑制,没有
查询用户。

这个选项对于 C++ 程序特别有用,因为它打印出
根据需要使用错误名称进行抑制。

请注意,打印的抑制尽可能具体。 你可能想要共同
通过在函数名称中添加通配符并使用帧级
通配符。 通配符功能强大而灵活,并带有一些
仔细编辑,您可能能够抑制整个系列的相关错误
只有一些压制。

有时两个不同的错误被同一个抑制抑制,在这种情况下
Valgrind 会多次输出抑制,但你只需要一个
复制到您的抑制文件中(但有多个不会导致问题)。 还,
抑制名称给出为; 这个名字没有
真的很重要,它只用于 -v 打印出所有使用的抑制的选项
纪录。

--输入-fd= [默认: 0, 标准输入]
使用时 --gen-suppressions=是, Valgrind 将停止以读取键盘输入
当每个错误发生时你。 默认情况下,它从标准输入(stdin)读取,
这对于关闭标准输入的程序来说是有问题的。 此选项允许您指定
从中读取输入的替代文件描述符。

--dsymutil=否|是 [是的]
此选项仅在 Mac OS X 上运行 Valgrind 时相关。

Mac OS X 使用延迟调试信息 (debuginfo) 链接方案。 当对象
包含 debuginfo 的文件链接到 .dylib 或可执行文件,debuginfo 是
没有复制到最终文件中。 相反,调试信息必须通过手动链接
在可执行文件或 .dylib 上运行 dsymutil(系统提供的实用程序)。 这
生成的组合调试信息放置在可执行文件旁边的目录中或
.dylib,但扩展名为 .dSYM。

通过 --dsymutil=否, Valgrind 将检测 .dSYM 目录是
丢失,或存在但似乎与关联的可执行文件不匹配或
.dylib,很可能是因为它已经过时了。 在这些情况下,Valgrind 将打印一个
警告消息,但不采取进一步措施。

通过 --dsymutil=是, 在这种情况下,Valgrind 将自动运行 dsymutil 作为
使调试信息保持最新所必需的。 出于所有实际目的,如果你总是
使用 --dsymutil=是,则永远不需要手动或作为一部分运行 dsymutil
应用程序的构建系统,因为 Valgrind 将根据需要运行它。

Valgrind 不会尝试在任何可执行文件或库上运行 dsymutil /用户名/,
/箱/, /宾/, /选择/, /sw/, /System/, /Library/ 或 /Applications/ 因为 dsymutil 将
在这种情况下总是失败。 它失败了,因为这样的调试信息
预装的系统组件在任何地方都不可用,也因为它会
需要在这些目录中的写权限。

使用时要小心 --dsymutil=是, 因为它会导致预先存在的 .dSYM
静默删除和重新创建的目录。 还要注意 dsymutil 是相当
缓慢,有时过于缓慢。

--max-stackframe= [默认: 2000000]
堆栈帧的最大大小。 如果堆栈指针移动超过这个量
那么 Valgrind 将假定程序正在切换到不同的堆栈。

如果您的程序具有大的堆栈分配数组,您可能需要使用此选项。
Valgrind 会跟踪程序的堆栈指针。 如果变化超过
阈值数量,Valgrind 假设您的程序正在切换到不同的堆栈,并且
Memcheck 的行为与堆栈指针变化小于
临界点。 通常这种启发式方法效果很好。 但是,如果您的程序分配了大量
堆栈上的结构,这种启发式将被愚弄,随后 Memcheck 将
报告大量无效的堆栈访问。 此选项允许您更改
阈值不同。

如果 Valgrind 的调试输出将您引导至
这样做。 在这种情况下,它会告诉您应该指定的新阈值。

通常,在堆栈上分配大型结构是一个坏主意,因为您可以
很容易耗尽堆栈空间,尤其是在内存有限或
希望支持大量线程,每个线程都有一个小堆栈,也因为
Memcheck 执行的错误检查对堆分配的数据更有效
而不是堆栈分配的数据。 如果您必须使用此选项,您可能希望
考虑重写您的代码以在堆上而不是在堆栈上分配。

--main-stacksize= [默认: 使用 当前 'ulimit' 价值]
指定主线程堆栈的大小。

为了简化它的内存管理,Valgrind 为主要的内存保留了所有需要的空间。
启动时线程的堆栈。 这意味着它需要知道所需的堆栈大小
启动。

默认情况下,Valgrind 使用当前的“ulimit”值作为堆栈大小,或 16 MB,
以较低者为准。 在许多情况下,这提供了 8 到 16 MB 范围内的堆栈大小,
对于大多数应用程序几乎从不溢出。

如果您需要更大的总堆栈大小,请使用 --主堆栈大小 来指定它。 只设置
高到您需要的高度,因为保留的空间远远超过您需要的空间(即数百
多于您需要的兆字节)限制 Valgrind 的内存分配器,并且可能
减少 Valgrind 可以使用的内存总量。 这只是真的
在 32 位机器上的意义。

在 Linux 上,您可以请求最大为 2GB 的堆栈。 Valgrind 将停止
如果无法分配堆栈,则会出现诊断消息。

--主堆栈大小 仅影响程序初始线程的堆栈大小。 它有
与线程堆栈的大小无关,因为 Valgrind 不分配这些。

您可能需要同时使用两者 --主堆栈大小--最大堆栈帧 一起。 这是
理解这一点很重要 --主堆栈大小 设置最大总堆栈大小,
--最大堆栈帧 指定任何一个堆栈帧的最大大小。 你会
必须解决 --主堆栈大小 对自己的价值(通常,如果您
应用程序段错误)。 但是 Valgrind 会告诉你需要的 --最大堆栈帧 尺寸,
如果必要的。

正如在描述中进一步讨论的 --最大堆栈帧, 一个大的要求
堆栈是潜在可移植性问题的标志。 最好建议您将所有
堆分配的内存中的大数据。

--max-threads= [默认: 500]
默认情况下,Valgrind 最多可以处理 500 个线程。 有时,这个数字太
小的。 使用此选项可提供不同的限制。 例如 --max-threads=3000。

MALLOC()-相关 配置


对于使用自己的 malloc 版本的工具(例如 Memcheck、Massif、Helgrind、DRD),
以下选项适用。

--对齐= [默认: 8 or 根据 on 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 平台]
默认情况下 Valgrind 的 分配, 重新分配等,返回一个起始地址为
8 字节对齐或 16 字节对齐(该值取决于平台并匹配
平台默认)。 此选项允许您指定不同的对齐方式。 这
提供的值必须大于或等于默认值,小于或等于
4096,并且必须是 XNUMX 的幂。

--redzone-size= [默认: 依靠 on 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 工具]
瓦尔格林的 马洛克, 重新分配, 等,在每个堆块之前和之后添加填充块
由正在运行的程序分配。 这种填充块被称为红区。 这
redzone 大小的默认值取决于工具。 例如,Memcheck 添加和
在客户端分配的每个块之前和之后保护至少 16 个字节。
这允许它检测最多 16 个字节的块欠载或溢出。

增加红区大小可以检测到更大距离的超限,
但增加了 Valgrind 使用的内存量。 减小 redzone 大小将
减少 Valgrind 所需的内存,但也减少了检测的机会
超过/不足,所以不推荐。

罕见 配置


这些选项适用于所有工具,因为它们会影响 Valgrind 的某些模糊工作
核。 大多数人不需要使用它们。

--smc-检查= [默认: 全非文件 HPMC胶囊 x86/amd64/s390x,
HPMC胶囊 other 拱门]
该选项控制 Valgrind 对自修改代码的检测。 如果没有检查是
done,当程序执行一些代码时,然后用新代码覆盖它,并且
执行新代码,Valgrind 将继续执行它所做的翻译
旧代码。 这可能会导致不正确的行为和/或崩溃。

对于“现代”架构——任何不是 x86、amd64 或 s390x 的——默认
is . 这是因为正确的程序必须采取明确的行动来重新建立
代码修改后的 DI 缓存一致性。 Valgrind 观察并尊重这样的
操作,结果是自修改代码被透明地处理为零
额外费用。

对于 x86、amd64 和 s390x,程序不需要通知硬件
需要 DI 一致性同步。 因此默认是 全非文件,涵盖了
将代码生成到匿名(非文件支持) mmap 区域的正常情况。

四种可用设置的含义如下。 无检测(没有),
检测堆栈上的自修改代码(GCC 使用它来实现嵌套
职能) (),到处检测自修改代码(所有),并检测
除了文件支持的映射(全非文件).

所有 会显着减慢 Valgrind。 运行 没有 很少会
加快速度,因为在大多数程序中动态生成的代码很少。
这个 VALGRIND_DISCARD_Translations 客户请求是替代 --smc-check=全部
--smc-check=所有非文件 这需要更多的程序员努力,但允许 Valgrind
通过准确地告诉它何时需要翻译来更快地运行您的程序
重新制作。

--smc-check=所有非文件 提供更便宜但更有限的版本
--smc-check=全部. 它将检查任何不是源自的翻译
文件支持的内存映射。 生成代码的典型应用程序,例如 JIT
在 Web 浏览器中,将代码生成到匿名 mmaped 区域,而“固定”代码
浏览器始终存在于文件支持的映射中。 --smc-check=所有非文件 需要
这种观察的优势,将检查的开销限制在
可能是 JIT 生成的。

--read-inline-info= [默认: 请点击 下面]
启用后,Valgrind 将从 DWARF3 读取有关内联函数调用的信息
调试信息。 这会减慢 Valgrind 的启动速度并使其使用更多内存(通常用于
每个内联的代码段,6 个单词和函数名称的空格),但结果
在更具描述性的堆栈跟踪中。 对于 3.10.0 版本,此功能已启用
默认情况下仅适用于 Linux、Android 和 Solaris 目标以及仅适用于工具
Memcheck、Helgrind 和 DRD。 这是一些堆栈跟踪的示例
--read-inline-info=否:

==15380== 条件跳转或移动取决于未初始化的值
==15380== 在 0x80484EA: main (inlinfo.c:6)
== == 15380
==15380== 条件跳转或移动取决于未初始化的值
==15380== 在 0x8048550: fun_noninline (inlinfo.c:6)
==15380== 由 0x804850E: main (inlinfo.c:34)
== == 15380
==15380== 条件跳转或移动取决于未初始化的值
==15380== 在 0x8048520: main (inlinfo.c:6)

这里有相同的错误 --read-inline-info=是:

==15377== 条件跳转或移动取决于未初始化的值
==15377== 在 0x80484EA: fun_d (inlinfo.c:6)
==15377== 由 0x80484EA: fun_c (inlinfo.c:14)
==15377== 由 0x80484EA: fun_b (inlinfo.c:20)
==15377== 由 0x80484EA: fun_a (inlinfo.c:26)
==15377== 由 0x80484EA: main (inlinfo.c:33)
== == 15377
==15377== 条件跳转或移动取决于未初始化的值
==15377== 在 0x8048550: fun_d (inlinfo.c:6)
==15377== 由 0x8048550: fun_noninline (inlinfo.c:41)
==15377== 由 0x804850E: main (inlinfo.c:34)
== == 15377
==15377== 条件跳转或移动取决于未初始化的值
==15377== 在 0x8048520: fun_d (inlinfo.c:6)
==15377== 由 0x8048520: 主要 (inlinfo.c:35)

--read-var-info= [默认: 不]
启用后,Valgrind 将从中读取有关变量类型和位置的信息
DWARF3 调试信息。 这会显着减慢 Valgrind 的启动速度并使其使用
显着更多的内存,但对于可以利用它的工具(Memcheck,
Helgrind, DRD)它可以导致更精确的错误消息。 例如,这里有
Memcheck 发布的一些标准错误:

==15363== 在客户端检查请求期间发现未初始化的字节
==15363== 在 0x80484A9: 呱呱 (varinfo1.c:28)
==15363== 由 0x8048544: 主要 (varinfo1.c:55)
==15363== 地址 0x80497f7 是数据符号“global_i7”内的 2 个字节
== == 15363
==15363== 在客户端检查请求期间发现未初始化的字节
==15363== 在 0x80484A9: 呱呱 (varinfo1.c:28)
==15363== 由 0x8048550: 主要 (varinfo1.c:56)
==15363== 地址 0xbea0d0cc 在线程 1 的堆栈上
==15363== 在框架 #1 中,由 main (varinfo1.c:45) 创建

这里有相同的错误 --read-var-info=是:

==15370== 在客户端检查请求期间发现未初始化的字节
==15370== 在 0x80484A9: 呱呱 (varinfo1.c:28)
==15370== 由 0x8048544: 主要 (varinfo1.c:55)
==15370== 位置 0x80497f7 是 global_i0[2] 中的 7 个字节,
==15370== 在 varinfo1.c:41 处声明的全局变量
== == 15370
==15370== 在客户端检查请求期间发现未初始化的字节
==15370== 在 0x80484A9: 呱呱 (varinfo1.c:28)
==15370== 由 0x8048550: 主要 (varinfo1.c:56)
==15370== 位置 0xbeb4a0cc 是本地变量“local”中的 0 个字节
==15370== 在线程 1 的帧 #46 中的 varinfo1.c:1 处声明

--vgdb-轮询= [默认: 5000]
作为其主循环的一部分,Valgrind 调度程序将轮询以检查某些活动是否
(例如外部命令或来自 gdb 的某些输入)必须由 gdbserver 处理。
此活动轮询将在运行给定数量的基本块(或
略多于给定数量的基本块)。 这个民意调查很便宜所以
默认值设置的比较低。 如果 vgdb,您可能会进一步减小此值
如果所有线程(大多数线程)都在,则不能使用 ptrace 系统调用来中断 Valgrind
time) 阻塞在系统调用中。

--vgdb-shadow-registers=否|是 [默认: 不]
激活后,gdbserver 会将 Valgrind 影子寄存器暴露给 GDB。 有了这个,
可以使用 GDB 检查或更改 Valgrind 影子寄存器的值。
暴露影子寄存器仅适用于 GDB 7.1 或更高版本。

--vgdb-前缀= [默认: /tmp/vgdb-管道]
为了与 gdb/vgdb 通信,Valgrind gdbserver 创建了 3 个文件(2 个命名的 FIFO
和一个 mmap 共享内存文件)。 prefix 选项控制目录和前缀
用于创建这些文件。

--run-libc-freeres= [默认: 是的]
此选项仅在 Linux 上运行 Valgrind 时相关。

GNU C 库(库文件),被所有程序使用,可以为
它自己的用途。 通常它不会在程序结束时释放那块内存——
没有意义,因为 Linux 内核会在
进程无论如何都会退出,所以它只会减慢速度。

glibc 作者意识到这种行为会导致泄漏检查器,例如 Valgrind,
在退出时进行泄漏检查时错误地报告 glibc 中的泄漏。 为了避免
为此,他们提供了一个名为 __libc_freeres 专门用来发布 glibc
它分配的所有内存。 因此 Memcheck 尝试运行 __libc_freeres 在出口处。

不幸的是,在一些非常旧的 glibc 版本中, __libc_freeres 是足够的
buggy 导致分段错误。 这在 Red Hat 7.1 上尤为明显。
所以提供这个选项是为了禁止运行 __libc_freeres。 如果您的
程序似乎在 Valgrind 上运行良好,但在退出时出现段错误,您可能会发现
--run-libc-freeres=否 修复了这个问题,尽管代价是可能会误报
libc.so 中的空间泄漏。

--sim 提示=提示 1,提示 2,...
将杂项提示传递给 Valgrind,它稍微修改了
非标准或危险的方式,可能有助于模拟奇怪的特征。 经过
默认不启用提示。 谨慎使用! 目前已知的提示有:

· 松弛ioctls: 对 ioctl 处理非常松懈; 唯一的假设是大小
是正确的。 写入时不需要初始化完整的缓冲区。
没有这个,用一些设备驱动用大量奇怪的ioctl
命令变得很烦人。

· 保险丝兼容: 为某些可能阻塞的系统调用启用特殊处理
在 FUSE 文件系统中。 在运行 Valgrind 时,这可能是必要的
使用一个线程来管理 FUSE 文件系统的多线程程序和
另一个线程来访问该文件系统。

· 启用外部: 启用正在运行的程序时所需的一些特殊魔法
本身 Valgrind。

· 无内部前缀: 禁用打印前缀 > 在每个 stdout 或 stderr 之前
内部 Valgrind 中的输出线由外部 Valgrind 运行。 这很有用
在外部/内部设置中运行 Valgrind 回归测试时。 请注意,
字首 > 将始终打印在内部调试日志记录行的前面。

· no-nptl-pthread-stackcache: 此提示仅在运行 Valgrind 时相关
Linux操作系统。

GNU glibc pthread 库(libpthread.so),由 pthread 程序使用,
维护 pthread 堆栈的缓存。 当 pthread 终止时,使用的内存
对于 pthread 堆栈和一些线程本地存储相关的数据结构不是
总是直接释放。 该内存保存在缓存中(最多达到一定大小),
并且在启动新线程时重新使用。

此缓存会导致 helgrind 工具报告一些误报竞争条件
此缓存内存上的错误,因为 helgrind 不了解内部 glibc
缓存同步原语。 所以,在使用helgrind时,禁用缓存
有助于避免误报竞争条件,尤其是在使用线程时
本地存储变量(例如使用 __线 预选赛)。

使用memcheck工具时,禁用缓存可以保证glibc使用的内存
处理__thread 变量在线程终止时直接释放。

注意:Valgrind 使用 glibc 堆栈的一些内部知识禁用缓存
缓存实现并通过检查pthread的调试信息
图书馆。 因此,这种技术有些脆弱,可能不适用于所有 glibc
版本。 这已经用各种 glibc 版本(例如
2.11、2.16、2.18)在各种平台上。

· 松散的门: (仅限 Solaris)对门系统调用处理非常松懈
无法识别的门文件描述符。 不需要完整的缓冲区
写入时初始化。 没有这个,程序使用 库门(3LIB) 功能
完全专有的语义可能会报告大量误报。

--fair-sched= [默认: 不]
这个 --公平的 选项控制 Valgrind 用于序列化的锁定机制
线程执行。 锁定机制控制线程的调度方式,
不同的设置会在公平性和性能之间做出不同的权衡。 为了
有关 Valgrind 线程序列化方案的更多详细信息及其对
性能和线程调度,请参阅调度和多线程性能。

· 价值 --fair-sched=是 激活一个公平的调度程序。 总之,如果多个
当线程准备好运行时,线程将以循环方式进行调度。
此机制并非在所有平台或 Linux 版本上都可用。 如果不
可用,使用 --fair-sched=是 将导致 Valgrind 因错误而终止。

如果您正在运行
Valgrind 上的交互式多线程程序,例如 Web 浏览器。

· 价值 --fair-sched=尝试 如果在平台上可用,则激活公平调度。
否则会自动回退到 --公平调度=否.

· 价值 --公平调度=否 激活不保证公平性的调度程序
在准备运行的线程之间,但通常会提供最高的性能。

--kernel-variant=variant1,variant2,...
处理由默认内核的次要变体引起的系统调用和 ioctl
这个平台。 这对于在被黑的内核或内核模块上运行很有用
例如,它支持非标准的 ioctl。 谨慎使用。 如果你不
了解此选项的作用,那么您几乎肯定不需要它。 目前
已知的变体是:

· 程序: 支持 系统布罗克 x86 上的系统调用。 这是为了在 BProc 上运行,
这是标准 Linux 的一个次要变体,有时用于构建
集群。

· android-无硬件-tls: ARM 的某些版本的 Android 模拟器不提供
硬件 TLS(线程本地状态)注册,并且 Valgrind 在启动时崩溃。 用
此变体选择对 TLS 的软件支持。

· android-gpu-sgx5xx: 使用它来支持处理专有 ioctl
Android 设备上的 PowerVR SGX 5XX 系列 GPU。 不选择此项不会
导致稳定性问题,但可能会导致 Memcheck 报错后
程序执行特定于 GPU 的 ioctl。

· android-gpu-adreno3xx: 同样,使用它来支持处理专有
适用于 Android 设备上的 Qualcomm Adreno 3XX 系列 GPU 的 ioctl。

--merge-recursive-frames= [默认: 0]
一些递归算法,例如平衡二叉树实现,创建
许多不同的堆栈跟踪,每个都包含调用循环。 一个循环定义为
由零个或多个其他程序计数器分隔的两个相同的程序计数器值
值。 Valgrind 可能会使用大量内存来存储所有这些堆栈跟踪。 这是
考虑到此类堆栈跟踪包含重复的无趣的内存使用不当
递归调用而不是更有趣的信息,例如具有
发起递归调用。

选项 --merge-recursive-frames= 指示 Valgrind 检测和合并
递归调用周期的大小高达 帧。 当这样的循环是
检测到,Valgrind 在堆栈跟踪中记录循环作为唯一的程序计数器。

值 0(默认值)不会导致递归调用合并。 值为 1 将导致
简单递归算法的堆栈跟踪(例如,阶乘实现)
被折叠。 通常需要值为 2 来折叠生成的堆栈跟踪
通过递归算法,如二叉树、快速排序等。更高的值可能是
需要更复杂的递归算法。

注意:递归调用是通过分析程序计数器值来检测的。 他们不是
通过查看函数名称来检测。

--num-transtab-sectors= [默认: 6 HPMC胶囊 安卓 平台, 16 HPMC胶囊 所有 其他]
Valgrind 以小片段形式翻译和检测程序的机器代码
(基本块)。 翻译被存储在一个被划分的翻译缓存中
分成多个部分(扇区)。 如果缓存已满,则包含
最旧的翻译被清空并重新使用。 如果再次需要这些旧的翻译,
Valgrind 必须重新翻译和重新插装相应的机器代码,也就是
昂贵的。 如果程序的“执行指令”工作集很大,增加
扇区的数量可以通过减少数量来提高性能
需要重新翻译。 扇区是按需分配的。 一旦分配,一个扇区可以
永远不会被释放,并占据相当大的空间,取决于工具和价值
of --avg-transtab-条目大小 (对于 Memcheck,每个扇区大约 40 MB)。 使用选项
--stats=是 获取有关扇区使用的内存的精确信息以及
部门的分配和回收。

--avg-transtab-entry-size= [默认: 0, 使用 工具 提供 默认]
翻译的基本块的平均大小。 此平均大小用于标注
一个扇区的大小。 每个工具都提供了要使用的默认值。 如果这个默认值
太小,翻译部门会很快变满。 如果这个默认
值太大,翻译扇区内存的很大一部分将不被使用。
请注意,基本块翻译的平均大小取决于工具,并且可能
取决于工具选项。 例如,memcheck 选项 --track-origins=是 增加
基本块翻译的大小。 用 --avg-transtab-条目大小 调整
扇区的大小,以获得内存或避免过多的重新转换。

--aspace-minaddr= [默认: 依靠 on 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 平台]
为了避免与某些系统库的潜在冲突,Valgrind 不使用
下面的地址空间 --aspace-minaddr 价值,保留它以防万一图书馆
专门请求该区域的内存。 因此,猜测了一些“悲观”值
由 Valgrind 提供,具体取决于平台。 在 linux 上,默认情况下,Valgrind 避免使用
即使在这个完整区域中通常没有冲突,前 64MB 也是如此。 您可以使用
选项 --aspace-minaddr 让你的内存饥渴的应用程序受益
更多的这种较低的内存。 另一方面,如果遇到冲突,增加
aspace-minaddr 值可能会解决它。 冲突通常表现为
mmap 在地址空间的低范围内失败。 提供的地址必须是页面
对齐并且必须等于或大于 0x1000 (4KB)。 找到你的默认值
平台,做一些事情,比如 valgrind -d -d date 2>&1 | grep -i minaddr. 价值观
已知低于 0x10000 (64KB) 会在某些发行版上产生问题。

--valgrind-stacksize= [默认: 1MB]
对于每个线程,Valgrind 需要自己的“私有”堆栈。 这些的默认大小
堆栈的尺寸很大,因此在大多数情况下应该足够了。 万一
size 太小,Valgrind 会出现段错误。 在段错误之前,警告可能是
Valgrind 在接近极限时产生。

使用选项 --valgrind-堆栈大小 如果产生这样的(不太可能的)警告,或
Valgrind 由于分段违规而死亡。 此类分割违规已被
在分解巨大的 C++ 符号时看到。

如果您的应用程序使用许多线程并需要大量内存,您可以获得一些
通过使用选项减少这些 Valgrind 堆栈的大小来获得内存
--valgrind-堆栈大小.

--show-emwarns= [默认: 不]
启用后,Valgrind 会在某些情况下发出有关其 CPU 仿真的警告。
这些通常并不有趣。

--require-text-symbol=:sonamepatt:fnnamepatt
当 soname 匹配的共享对象时 索纳帕特 被加载到进程中,
检查它导出的所有文本符号。 如果这些都不匹配 名称格式,打印一个
错误信息并放弃运行。 这使得可以确保运行
除非给定的共享对象包含特定的函数名称,否则不会继续。

以上皆是 索纳帕特名称格式 可以使用通常的写法 ?* 通配符。 为了
例: ":*libc.so*:foo?bar". 您可以使用冒号以外的字符来分隔
两种模式。 重要的是第一个字符和分隔符
性格是一样的。 比如上面的例子也可以写成
"Q*libc.so*Qfoo?bar"。 多
--require-文本符号 允许使用标志,在这种情况下,加载的共享对象
进入过程将被检查所有这些。

这样做的目的是支持标记库的可靠使用。 例如,
假设我们有一个版本的 GCC libgomp.so 已标记为
支持 Helgrind 的注释。 加载错误太容易和混乱了,
未注释 libgomp.so 进入应用程序。 所以想法是:在
标记库,例如 annotated_for_helgrind_3_6,然后给标志
--require-text-symbol=:*libgomp*so*:annotated_for_helgrind_3_6 这样当 libgomp.so
加载后,Valgrind 扫描其符号表,如果符号不存在,则运行
中止,而不是默默地继续使用未标记的库。 请注意,您
应该将整个标志放在引号中以阻止 shell 向上扩展 *?
通配符。

--soname-synonyms=syn1=模式1,syn2=模式2,...
当加载共享库时,Valgrind 检查库中的函数
必须更换或包装。 例如,Memcheck 替换所有与 malloc 相关的
函数 (malloc, free, calloc, ...) 有自己的版本。 这样的替换是
默认情况下仅在 soname 与预定义 soname 匹配的共享库中完成
模式(例如 库文件* 在 Linux 上)。 默认情况下,静态不进行替换
链接库或替代库,例如 tcmalloc。 在某些情况下,
替换允许 --soname-同义词 指定一个额外的同义词模式,给出
更换灵活。

目前,这种灵活性只允许用于 malloc 相关函数,使用
同义词 索马洛克. 此同义词可用于所有执行标准替换的工具
malloc 相关函数(例如 memcheck、massif、drd、helgrind、exp-dhat、
exp-sgcheck)。

· Alternate malloc library:在一个alternate中替换malloc相关的函数
带 soname 的图书馆 mymalloclib.so,给出选项
--soname-synonyms=somalloc=mymalloclib.so. 一个模式可以用来匹配多个
图书馆 sonames。 例如, --soname-synonyms=somalloc=*tcmalloc* 将匹配
tcmalloc 库的所有变体的 soname(本机、调试、分析、...
tcmalloc 变体)。

注意:可以使用 readelf 检索精灵共享库的 soname
效用。

· 静态链接库中的替换是通过使用 没有 格局。
例如,如果您链​​接到 libtcmalloc.a, memcheck 将在您正常工作时
给选项 --soname-synonyms=somalloc=NONE. 请注意,NONE 模式将
匹配主可执行文件和任何没有 soname 的共享库。

· 运行 Linux 的“默认”Firefox 构建,其中 JEMalloc 链接到
主要可执行文件,使用 --soname-synonyms=somalloc=NONE.

调试 瓦尔格林 配置


还有一些用于调试 Valgrind 本身的选项。 你不应该需要使用它们
在正常情况下。 如果您想查看列表,请使用 --help-调试 选项。

内存检查 配置


--泄漏检查= [默认: 概括]
启用后,在客户端程序完成时搜索内存泄漏。 如果设置为
摘要,它表示发生了多少泄漏。 如果设置为 or , 每个单独的泄漏
将详细显示和/或计为错误,如选项所指定
--显示泄漏种类--泄漏类型错误.

--泄漏分辨率= [默认: 高的]
在进行泄漏检查时,确定 Memcheck 是否愿意考虑不同的
为了将多个泄漏合并为一个,回溯是相同的
泄漏报告。 当设置为 ,只有前两个条目需要匹配。 什么时候 ,四
条目必须匹配。 什么时候 ,所有条目都需要匹配。

对于核心泄漏调试,您可能想要使用 --泄漏分辨率=高 一起
- --呼叫者数量=40 或者一些这么大的数字。

请注意 --泄漏分辨率 设置不影响 Memcheck 的查找能力
泄漏。 它只会改变结果的呈现方式。

--show-leak-kinds= [默认: 确定,可能]
指定要显示在 泄漏搜索,通过以下方式之一:

· 一个或多个逗号分隔的列表 间接 可能 可达.

· 所有 指定完整的集合(所有泄漏类型)。 它相当于
--show-leak-kinds=确定,间接,可能,可达.

· 没有 为空集。

--errors-for-leak-kinds= [默认: 确定,可能]
指定要计为错误的泄漏种类 泄漏搜索。 这 is
指定类似于 --显示泄漏种类

--leak-check-heuristics= [默认: 全部]
指定泄漏搜索期间要使用的一组泄漏检查启发式方法。 这
启发式控制哪些内部指针指向一个块导致它被视为
可达。 启发式集通过以下方式之一指定:

· 一个或多个逗号分隔的列表 标准字符串 长度64 新数组
多重继承.

· 所有 激活完整的启发式集。 它相当于
--leak-check-heuristics=stdstring,length64,newarray,多重继承.

· 没有 为空集。

请注意,这些启发式方法取决于生成的对象的布局
C++编译器。 它们已经用一些 gcc 版本(例如 4.4 和 4.7)进行了测试。 他们
可能无法与其他 C++ 编译器一起正常工作。

--show-reachable= , --show-possably-lost=
这些选项提供了另一种指定要显示的泄漏类型的方法:

· --show-reachable=否 --show-possably-lost=yes 相当于
--show-leak-kinds=确定,可能.

· --show-reachable=否 --show-possably-lost=no 相当于
--show-leak-kinds=确定.

· --show-reachable=是 相当于 --show-leak-kinds=全部.

需要注意的是 --show-possably-lost=no 没有效果,如果 --show-reachable=是 已指定。

--undef-value-errors= [默认: 是的]
控制 Memcheck 是否报告未定义值错误的使用。 将此设置为 没有 if
您不想看到未定义的值错误。 它也有超速的副作用
稍微提高了 Memcheck。

--track-origins= [默认: 不]
控制 Memcheck 是否跟踪未初始化值的来源。 默认情况下,它
没有,这意味着虽然它可以告诉您未初始化的值是
以危险的方式使用,它无法告诉您未初始化的值来自哪里
从。 这通常使得追踪根本问题变得困难。

设置为 , Memcheck 会跟踪所有未初始化值的来源。
然后,当报告未初始化的值错误时,Memcheck 将尝试显示
价值的来源。 原点可以是以下四个位置之一:堆块、
堆栈分配、客户端请求或其他杂项来源(例如,调用
BRK).

对于源自堆块的未初始化值,Memcheck 显示块的位置
被分配。 对于源自堆栈分配的未初始化值,Memcheck
可以告诉您哪个函数分配了该值,但仅此而已 - 通常是
显示函数左大括号的源位置。 所以你应该
仔细检查所有函数的局部变量是否正确初始化。

性能开销:源头跟踪很昂贵。 它使 Memcheck 的速度减半,并且
将内存使用量至少增加 100MB,甚至更多。 尽管如此它可以
大大减少确定未初始化的根本原因所需的工作
重视错误,因此通常是程序员生产力的胜利,尽管运行更多
慢。

准确性:Memcheck 非常准确地跟踪起源。 避免非常大的空间和时间
开销,做了一些近似。 有可能,虽然不太可能,
Memcheck 将报告不正确的来源,或无法识别任何来源。

注意组合 --track-origins=是--undef-value-errors=否 is
无稽之谈。 Memcheck 在启动时检查并拒绝此组合。

--partial-loads-ok= [默认: 是的]
控制 Memcheck 如何处理 32 位、64 位、128 位和 256 位自然对齐加载
某些字节可寻址而其他字节不可寻址的地址。 什么时候 ,这样
加载不会产生地址错误。 相反,加载的字节来自非法
地址标记为未初始化,与合法地址对应的地址为
按正常方式处理。

在规划婴儿食品行业的工艺要求时,安全性和可靠性是工艺设计中最重要的方面。 没有, 来自部分无效地址的加载被视为与来自
完全无效的地址:发出非法地址错误,并导致
字节被标记为已初始化。

请注意,以这种方式运行的代码违反了 ISO C/C++ 标准,
并且应该被认为是坏掉的。 如果可能的话,应该修复这样的代码。

--昂贵的定义检查= [默认: 不]
控制 Memcheck 是否应该使用更精确但也更昂贵(时间
在检查值的定义时消耗)算法。 默认设置是
不这样做,通常就足够了。 但是,对于高度优化的代码
valgrind 有时可能会错误地抱怨。 调用 valgrind
--昂贵的定义检查=是 有帮助,但需要付出性能代价。 运行
已经观察到 25% 的退化,但额外的成本在很大程度上取决于
手头的申请。

--keep-stacktraces=alloc|free|分配和释放|分配然后释放|无 [默认:
分配和免费]
控制为 malloc'd 和/或 free'd 块保留哪些堆栈跟踪。

通过 分配然后免费,在分配时记录堆栈跟踪,并关联
与块。 当块被释放时,记录第二个堆栈跟踪,这
替换分配堆栈跟踪。 因此,任何与“免费使用后使用”相关的错误
到这个块只能显示块被释放的位置的堆栈跟踪。

通过 分配和释放, 块的分配和释放堆栈跟踪
被存储。 因此,“释放后使用”错误将同时显示两者,这可能会导致错误
更容易诊断。 相比 分配然后免费,此设置略有增加
Valgrind 的内存使用作为块包含两个引用而不是一个引用。

通过 分配,仅记录(和报告)分配堆栈跟踪。 和 免费,
仅记录(和报告)释放堆栈跟踪。 这些值有点
减少 Valgrind 的内存和 CPU 使用率。 它们可能有用,具体取决于错误
您正在搜索的类型以及分析它们所需的详细程度。 为了
例如,如果你只对内存泄漏错误感兴趣,记录下就足够了
分配堆栈跟踪。

通过 没有,不会记录 malloc 和 free 操作的堆栈跟踪。 如果你的
程序分配了很多块和/或从许多不同的堆栈中分配/释放
跟踪,这可以显着减少所需的 CPU 和/或内存。 当然,少数
将报告与堆块相关的错误的详细信息。

请注意,一旦记录了堆栈跟踪,Valgrind 会将堆栈跟踪保存在内存中
即使它没有被任何块引用。 一些程序(例如,递归
算法)可以生成大量的堆栈跟踪。 如果 Valgrind 使用太多
在这种情况下,您可以使用选项减少所需的内存
--保持堆栈跟踪 和/或通过对选项使用较小的值 --num-来电者.

--freelist-vol= [默认: 20000000]
当客户端程序使用 免费 (在 C 中)或删除(C++),那个内存
不会立即用于重新分配。 相反,它被标记
不可访问并放置在已释放块的队列中。 目的是推迟,只要
可能是释放的内存重新进入循环的点。 这个
增加 Memcheck 能够检测到对块的无效访问的机会
在他们被释放后的相当长一段时间内。

此选项指定队列中块的最大总大小(以字节为单位)。
默认值为 XNUMX 万字节。 增加此项会增加总量
Memcheck 使用的内存,但可能会检测到已释放块的无效使用,这会
否则不被发现。

--freelist-big-blocks= [默认: 1000000]
当释放块队列中的块可用于重新分配时,
Memcheck 将优先重新循环大小大于或等于的块
--freelist-大块. 这确保释放大块(特别是释放
块大于 --freelist-vol) 不会立即导致重新流通
空闲列表中的所有(或很多)小块。 换句话说,这个选项
增加了发现“小”块的悬空指针的可能性,即使
当大块被释放时。

将值设置为 0 意味着所有块都以 FIFO 顺序重新循环。

--workaround-gcc296-bugs= [默认: 不]
启用后,假设在堆栈指针下方读取和写入一小段距离
是由于 GCC 2.96 中的错误引起的,并且不报告它们。 “小距离”是 256
默认为字节。 请注意,GCC 2.96 是一些古老的 Linux 上的默认编译器
发行版(RedHat 7.X),因此您可能需要使用此选项。 请勿使用它,如果
您不必这样做,因为它可能会导致忽略真正的错误。 更好的选择
是使用更新的 GCC,其中修复了此错误。

在 3 位上使用 GCC 4.X 或 32.X 时,您可能还需要使用此选项
PowerPC Linux。 这是因为 GCC 生成的代码偶尔会访问下面
堆栈指针,特别是对于浮点到/从整数转换。 这个
违反了 32 位 PowerPC ELF 规范,该规范没有规定
要访问的堆栈指针下方的位置。

--show-mismatched-frees= [默认: 是的]
启用后,Memcheck 使用一个函数检查堆块是否被释放
匹配分配函数。 也就是说,它期望 免费 用于解除分配
分配的块 分配, 删除 对于分配的块 删除[] HPMC胶囊
分配的块 新的[]. 如果检测到不匹配,则会报告错误。 这是在
一般很重要,因为在某些环境中,使用不匹配的函数释放
可能导致崩溃。

然而,存在无法避免这种不匹配的情况。 那是当
用户提供的实现 /新的[] 那个电话 分配删除/删除[]
那个电话 免费,并且这些函数是非对称内联的。 例如,想象
删除[] 是内联的,但是 新的[] 不是。 结果是Memcheck“看到”了所有
删除[] 直接调用 免费, 即使程序源不包含
不匹配的调用。

这会导致许多令人困惑和不相关的错误报告。
--show-mismatched-frees=否 禁用这些检查。 一般不建议
但是,禁用它们,因为您可能会因此错过真正的错误。

--ignore-ranges=0xPP-0xQQ[,0xRR-0xSS]
此选项中列出的任何范围(并且可以指定多个范围,由
逗号)将被 Memcheck 的可寻址性检查忽略。

--malloc-fill=
填充由 malloc、new 等分配的块,但不是由 calloc 分配的,具有指定的
字节。 这在尝试摆脱模糊的内存损坏问题时非常有用。
分配的区域仍然被 Memcheck 视为未定义 - 仅此选项
影响其内容。 注意 --malloc-填充 不影响内存块时
它用作客户端请求的参数 VALGRIND_MEMPOOL_ALLOC 或
VALGRIND_MALLOCLIKE_BLOCK。

--免费填充=
用指定的字节值填充由 free、delete 等释放的块。 这可以
在尝试摆脱模糊的内存损坏问题时很有用。 释放的区域是
仍然被 Memcheck 视为对访问无效——此选项仅影响其
内容。 注意 --免费填充 用作内存块时不会影响内存块
客户端请求 VALGRIND_MEMPOOL_FREE 或 VALGRIND_FREELIKE_BLOCK 的参数。

缓存研磨 配置


--I1= , , 尺寸>
指定一级指令缓存的大小、关联性和行大小。

--D1= , , 尺寸>
指定一级数据缓存的大小、关联性和行大小。

--LL= , , 尺寸>
指定最后一级缓存的大小、关联性和行大小。

--cache-sim=否|是 [是的]
启用或禁用缓存访问和未命中计数的收集。

--branch-sim=否|是 [不]
启用或禁用分支指令和错误预测计数的收集。 经过
默认情况下这是禁用的,因为它会降低 Cachegrind 大约 25% 的速度。 注意
你不能指定 --cache-sim=否--branch-sim=否 在一起,因为那样会离开
Cachegrind 没有要收集的信息。

--cachegrind-out-file=
将配置文件数据写入文件而不是默认输出文件,
缓存研磨。 . 这 %p%q 格式说明符可用于嵌入进程
ID 和/或名称中环境变量的内容,就像
核心选项 --日志文件.

呼叫研磨 配置


--callgrind-out-file=
将配置文件数据写入文件而不是默认输出文件,
呼出。 . 这 %p%q 格式说明符可用于嵌入进程
ID 和/或名称中环境变量的内容,就像
核心选项 --日志文件. 进行多次转储时,修改文件名
更远; 见下文。

--转储线= [默认: 是的]
这指定应以源行粒度执行事件计数。
这允许对使用调试信息编译的源进行源注释
(-g).

--dump-instr= [默认: 不]
这指定应以每个指令的粒度执行事件计数。
这允许汇编代码注释。 目前只能显示结果
通过 KCachegrind。

--compress-strings= [默认: 是的]
此选项会影响配置文件数据的输出格式。 它指定是否
字符串(文件名和函数名)应该用数字标识。 这缩小了
文件,但使人类更难阅读(不推荐在任何
案件)。

--compress-pos= [默认: 是的]
此选项会影响配置文件数据的输出格式。 它指定是否
数字位置总是指定为绝对值或允许
相对于之前的数字。 这会缩小文件大小。

--combine-dumps= [默认: 不]
启用后,当要生成多个配置文件数据部分时,这些部分是
附加到相同的输出文件。 不建议。

--dump-every-bb= [默认: 0, 绝不]
每次转储配置文件数据 基本块。 只检查是否需要转储
当 Valgrind 的内部调度程序运行时。 因此,有用的最小设置是
大约 100000。该计数是一个 64 位值,可实现较长的转储周期。

--dump-before=
进入时转储 function.

--零之前=
进入时所有费用为零 function.

--dump-after=
离开时倾倒 function.

--instr-atstart= [默认: 是的]
指定是否希望 Callgrind 从一开始就开始模拟和分析
该程序。 设置为 no 时,Callgrind 将无法收集任何信息,
包括通话,但它最多会减速大约 4,这是最小值
Valgrind 开销。 可以通过 callgrind_control 以交互方式启用检测
-离子。

请注意,生成的调用图很可能不包含 ,但会
包含启用检测后执行的所有功能。 仪表
也可以以编程方式启用/禁用。 请参阅 Callgrind 包含文件 callgrind.h
对于您必须在源代码中使用的宏。

对于缓存模拟,打开检测时结果会不太准确
在程序运行的后期,因为模拟器在那个时刻以一个空的缓存开始。
稍后打开事件收集以应对此错误。

--collect-atstart= [默认: 是的]
指定是否在配置文件运行开始时启用事件收集。

要仅查看程序的一部分,您有两种可能性:

1. 在进入要分析的程序部分之前将事件计数器归零,然后转储
离开该程序部分后,事件计数器到一个文件。

2. 根据需要打开/关闭收集状态,只看到发生的事件计数器
而在您要分析的程序部分内。

如果您要分析的程序部分被称为许多,则可以使用第二个选项
次。 选项 1,即创建大量转储在这里是不切实际的。

可以使用选项在给定函数的进入和退出时切换集合状态
--切换收集. 如果你使用这个选项,收集状态应该在
开始。 请注意,规范 --切换收集 隐式设置
--收集状态=否.

也可以通过插入客户端请求来切换集合状态
CALLGRIND_TOGGLE_COLLECT ; 在所需的代码位置。

--toggle-collect=
在进入/退出时切换收集 function.

--collect-跳转= [默认: 不]
这指定是否应收集(条件)跳转的信息。 作为
上面, callgrind_annotate 当前无法向您显示数据。 你必须使用
KCachegrind 在注释代码中获取跳转箭头。

--collect-systime= [默认: 不]
这指定是否应收集系统调用时间的信息。

--collect-bus= [默认: 不]
这指定是否应该收集执行的全局总线事件的数量。
事件类型“Ge”用于这些事件。

--cache-sim= [默认: 不]
指定是否要进行完整缓存模拟。 默认情况下,只读取指令
访问将被计数(“Ir”)。 通过缓存模拟,更多的事件计数器是
启用:指令读取(“I1mr”/“ILmr”)、数据读取访问(“Dr”)时缓存未命中
和相关的缓存未命中(“D1mr”/“DLmr”)、数据写入访问(“Dw”)和相关的缓存
未命中(“D1mw”/“DLmw”)。 有关更多信息,请参阅 Cachegrind:缓存和分支-
预测分析器。

--branch-sim= [默认: 不]
指定是否要进行分支预测模拟。 进一步的事件计数器是
启用:已执行的条件分支和相关预测器未命中数
("Bc"/"Bcm"),执行间接跳转和跳转地址预测器的相关未命中
(“Bi”/“Bim”)。

赫尔格林 配置


--free-is-write=否|是 [默认: 不]
启用时(不是默认设置),Helgrind 将堆内存的释放视为
内存是在释放之前立即写入的。 这暴露了内存所在的种族
被一个线程引用,被另一个线程释放,但没有可观察的
同步事件以确保引用发生在释放之前。

此功能是 Valgrind 3.7.0 中的新功能,被视为实验性的。 这是
默认情况下未启用,因为它与自定义内存分配器的交互不是
目前很好理解。 欢迎用户反馈。

--track-lockorders=否|是 [默认: 是的]
启用时(默认),Helgrind 执行锁顺序一致性检查。 为了
一些有缺陷的程序,报告的大量锁顺序错误可能会变成
烦人,特别是如果您只对种族错误感兴趣。 你可以因此
发现禁用锁定顺序检查很有帮助。

--history-level=none|大约|full [默认: 满的]
--历史级别=完整 (默认)导致 Helgrind 收集足够的关于
“旧”访问它可以在竞争报告中产生两个堆栈跟踪——两个堆栈
当前访问的跟踪,以及较旧的、冲突的访问的跟踪。 到
限制内存使用,“旧”访问堆栈跟踪限制为最多 8 个条目,
即使 --num-来电者 价值更大。

收集此类信息在速度和内存方面都很昂贵,尤其是对于
执行许多线程间同步事件(锁定、解锁等)的程序。
没有这些信息,就更难追查种族的根本原因。
尽管如此,在您只想检查
种族的存在与否,例如,在进行回归测试时
以前的无比赛计划。

--历史级别=无 是相反的极端。 这会导致 Helgrind 不收集任何
有关先前访问的信息。 这可能比
--历史级别=完整.

--history-level=大约 提供了这两个极端之间的妥协。 它导致
Helgrind 显示以后访问的完整跟踪,以及大概信息
关于更早的访问。 这个近似信息由两个堆栈组成,和
保证较早的访问发生在程序点之间的某处
由两个堆栈表示。 这不如显示确切的堆栈有用
以前的访问(如 --历史级别=完整 会),但总比没有好,而且
几乎一样快 --历史级别=无.

--冲突缓存大小=N [默认: 1000000]
此标志仅在 --历史级别=完整.

有关“旧”冲突访问的信息存储在大小有限的缓存中,
采用 LRU 式管理。 这是必要的,因为存储一个
程序进行的每个内存访问的堆栈跟踪。 历史资料
在最近未访问的位置被定期丢弃,以释放空间
缓存。

此选项控制缓存的大小,根据不同内存的数量
存储冲突访问信息的地址。 如果你发现
Helgrind 显示比赛错误,只有一个堆栈而不是预期的两个堆栈
堆栈,尝试增加此值。

最小值为 10,000,最大值为 30,000,000(默认值的 XNUMX 倍)
价值)。 将值增加 1 会使 Helgrind 的内存需求增加很多
大约 100 字节,所以最大值很容易吃掉三个额外的千兆字节左右
的记忆。

--check-stack-refs=否|是 [默认: 是的]
默认情况下,Helgrind 会检查您的程序对所有数据存储器的访问。 这旗
使您可以跳过检查对线程堆栈(局部变量)的访问。 这个可以
提高性能,但代价是在堆栈分配的数据上丢失了竞争。

--ignore-thread-creation= [默认: 不]
控制是否应忽略线程创建期间的所有活动。 默认情况下
仅在 Solaris 上启用。 Solaris 提供更高的吞吐量、并行性和
比其他操作系统具有可扩展性,代价是更细粒度的锁定
活动。 这意味着例如当在 glibc 下创建一个线程时,只有一个
大锁用于所有线程设置。 Solaris libc 使用几个细粒度的锁
并且创建者线程尽快恢复其活动,例如离开
堆栈和 TLS 设置序列到创建的线程。 这种情况让赫尔格林德感到困惑
因为它假设在创建者和被创造者之间存在一些错误的顺序
线; 因此应用程序中的许多类型的竞争条件都不会
报道。 为了防止这种错误的排序,这个命令行选项被设置为 yes
Solaris 上的默认设置。 因此,所有活动(加载、存储、客户端请求)都将被忽略
期间:

· pthread_create() 在创建者线程中调用

· 创建线程中的线程创建阶段(堆栈和TLS设置)

在线程创建期间分配的新内存也未被跟踪,即竞争报告
在那里被压制。 DRD 隐式地做同样的事情。 这是必要的,因为
Solaris libc 缓存了许多对象并将它们重用于不同的线程
把赫尔格林德弄糊涂了。

DRD 配置


--check-stack-var= [默认: 不]
控制 DRD 是否检测堆栈变量上的数据竞争。 验证堆栈变量
默认情况下禁用,因为大多数程序不共享堆栈变量
线程。

--exclusive-threshold= [默认: 离开]
如果任何互斥锁或写入器锁的持有时间超过该时间,则打印错误消息
以毫秒为单位指定。 此选项启用锁争用检测。

--join-list-vol= [默认: 10]
一个线程末尾的语句和另一个线程之间发生的数据竞争
如果在线程完成后立即丢弃内存访问信息,则可能会丢失
被加入。 此选项允许指定加入的线程内存数量
应保留访问信息。

--first-race-only= [默认: 不]
是否仅报告在内存位置检测到的第一个数据争用
或在内存位置检测到的所有数据争用。

--free-is-write= [默认: 不]
是否报告访问内存和释放内存之间的竞争。 启用这个
选项可能会导致 DRD 运行速度稍慢。 笔记:

· 使用自定义内存分配器时不要启用此选项
VG_USERREQ__MALLOCLIKE_BLOCK 和 VG_USERREQ__FREELIKE_BLOCK 因为那会
导致误报。

· 使用引用计数对象时不要启用此选项,因为那样会
导致误报,即使该代码已正确注释
ANNOTATE_HAPPENS_BEFORE 和 ANNOTATE_HAPPENS_AFTER。 见例如输出
以下命令为例: valgrind --tool=drd --free-is-write=yes
drd/tests/annotate_smart_pointer。

--report-signal-unlocked= [默认: 是的]
是否报告来电 pthread_cond_信号pthread_cond_广播 其中
与信号关联的互斥量通过 pthread_cond_wait or
pthread_cond_timed_wait发送信号时未锁定。 发送信号
没有对相关联的互斥锁持有锁是一个常见的编程错误,它可以
导致微妙的竞争条件和不可预测的行为。 存在一些不常见的
然而,在不持有信号的情况下发送信号是安全的同步模式
锁定关联的互斥锁。

--segment-merging= [默认: 是的]
控制段合并。 段合并是一种限制内存使用的算法
数据竞争检测算法。 禁用段合并可能会提高
比赛报告中显示的所谓“其他段”,但也可能触发出局
内存错误。

--segment-merging-interval= [默认: 10]
仅在指定数量的新段完成后才执行段合并
创建。 这是一个高级配置选项,允许您选择是否
通过选择一个较低的值来最小化 DRD 的内存使用,或者让 DRD 运行得更快
选择一个稍高的值。 该参数的最佳值取决于
正在分析的程序。 默认值适用于大多数程序。

--共享阈值= [默认: 离开]
如果读卡器锁的持有时间超过指定时间,则打印错误消息
(以毫秒为单位)。 此选项启用锁争用检测。

--show-confl-seg= [默认: 是的]
在比赛报告中显示有冲突的部分。 由于这些信息可以帮助您找到
由于数据竞争,默认情况下启用此选项。 禁用此选项会使
DRD的输出更紧凑。

--show-stack-usage= [默认: 不]
在线程退出时打印堆栈使用情况。 当程序创建大量
限制分配给线程的虚拟内存量变得很重要
线程堆栈。 这个选项可以观察到有多少堆栈内存
由客户端程序的每个线程使用。 注意:DRD 工具本身分配了一些
客户端线程堆栈上的临时数据。 此临时数据所需的空间
必须由客户端程序在分配堆栈内存时分配,但不是
包含在 DRD 报告的堆栈使用中。

--ignore-thread-creation= [默认: 不]
控制是否应忽略线程创建期间的所有活动。 默认情况下
仅在 Solaris 上启用。 Solaris 提供更高的吞吐量、并行性和
比其他操作系统具有可扩展性,代价是更细粒度的锁定
活动。 这意味着例如当在 glibc 下创建一个线程时,只有一个
大锁用于所有线程设置。 Solaris libc 使用几个细粒度的锁
并且创建者线程尽快恢复其活动,例如离开
堆栈和 TLS 设置序列到创建的线程。 这种情况使 DRD 感到困惑,因为它
假设在创建者和创建的线程之间存在一些错误的顺序; 和
因此不会报告应用程序中的许多类型的竞争条件。 到
防止此类错误排序,此命令行选项默认设置为 yes
索拉里斯。 因此,在以下期间忽略所有活动(加载、存储、客户端请求):

· pthread_create() 在创建者线程中调用

· 创建线程中的线程创建阶段(堆栈和TLS设置)

--trace-addr= [默认: 没有任何]
跟踪指定地址的所有加载和存储活动。 这个选项可能是
指定不止一次。

--ptrace-addr= [默认: 没有任何]
跟踪指定地址的所有加载和存储活动,并继续这样做
在该地址的内存被释放和重新分配之后。

--trace-alloc= [默认: 不]
跟踪所有内存分配和释放。 可能会产生大量的输出。

--trace-barrier= [默认: 不]
跟踪所有屏障活动。

--trace-cond= [默认: 不]
跟踪所有条件变量活动。

--trace-fork-join= [默认: 不]
跟踪所有线程创建和所有线程终止事件。

--trace-hb= [默认: 不]
跟踪 ANNOTATE_HAPPENS_BEFORE()、ANNOTATE_HAPPENS_AFTER() 和
ANNOTATE_HAPPENS_DONE() 客户端请求。

--trace-mutex= [默认: 不]
跟踪所有互斥体活动。

--trace-rwlock= [默认: 不]
跟踪所有读写锁活动。

--trace-semaphore= [默认: 不]
跟踪所有信号量活动。

地块 配置


--堆= [默认: 是的]
指定是否应进行堆分析。

--堆管理员= [默认: 8]
如果启用了堆分析,则将每个块的管理字节数提供给
用。 这应该是平均值的估计值,因为它可能会有所不同。 例如,
glibc 在 Linux 上使用的分配器每个块需要 4 到 15 个字节,
取决于各种因素。 该分配器还需要释放管理空间
块,但 Massif 无法解释这一点。

--stacks= [默认: 不]
指定是否应进行堆栈分析。 此选项会减慢 Massif 的速度
很大,所以默认情况下是关闭的。 请注意,Massif 假设主堆栈具有
启动时大小为零。 这不是真的,但要准确地做其他事情是困难的。
此外,从零开始更好地表示主堆栈部分的大小
用户程序实际上可以控制。

--pages-as-heap= [默认: 不]
告诉 Massif 在页面级别而不是在 malloc 块上分析内存
等级。 详情请参阅上文。

--深度= [默认: 30]
为详细快照记录的分配树的最大深度。 增加它
将使 Massif 运行得更慢,使用更多内存,并产生更大的输出
文件。

--alloc-fn=
使用此选项指定的函数将被视为堆
分配函数如 分配. 这对于作为包装器的函数很有用
分配 or ,这可以用无趣的信息填充分配树。
该选项可以在命令行中多次指定,以命名多个
功能。

请注意,命名函数只有在它是一个顶部条目时才会被这样对待
堆栈跟踪,或者就在另一个以这种方式处理的函数下方。 例如,如果你有
一个函数 内存分配1 那包裹着 分配内存分配2 那包裹着 内存分配1, 只是指定
--alloc-fn=malloc2 不会有任何影响。 您需要指定 --alloc-fn=malloc1 as
好。 这有点不方便,但原因是检查分配
功能很慢,如果 Massif 可以停止浏览,可以节省大量时间
一旦发现一个不匹配的而不是必须匹配的堆栈跟踪条目
继续浏览所有条目。

请注意,C++ 名称已被破坏。 另请注意,必须写入重载的 C++ 名称
在全。 单引号可能是必要的,以防止 shell 将它们分解。
例如:

--alloc-fn='operator new(unsigned, std::nothrow_t const&)'

--ignore-fn=
任何直接堆分配(即调用 分配, 等,或调用函数
由一个命名 --alloc-fn option) 出现在此选项指定的函数中
被忽略。 这主要用于测试目的。 可以指定这个选项
在命令行上多次,以命名多个函数。

任何 重新分配 被忽略的块也将被忽略,即使 重新分配 呼叫确实
不会出现在被忽略的函数中。 这避免了负堆大小的可能性
如果忽略的块被缩小 重新分配.

C++函数名的书写规则与for相同 --alloc-fn 以上。

--阈值= [默认: 1.0]
堆分配的显着性阈值,占总内存大小的百分比。
低于此值的分配树条目将被聚合。 注意
这应该与 ms_print 的同名选项一起指定。

--峰值误差= [默认: 1.0]
Massif 不一定会记录实际的全局内存分配峰值; 经过
默认情况下,仅当全局内存分配大小超过
之前的峰值至少下降 1.0%。 这是因为可以有很多本地分配
一路上的高峰,为每个人做一个详细的快照会很昂贵
并且很浪费,因为除了其中之一之外,其他所有东西后来都会被丢弃。 这种不准确可以是
通过此选项更改(甚至更改为 0.0%),但 Massif 的运行速度将大大减慢,因为
数接近于零。

--时间单位= [默认: i]
用于分析的时间单位。 三种可能:指令
已执行 (i),这对大多数情况都有好处; 实际(挂钟)时间(毫秒,即
毫秒),这有时很有用; 和在堆上分配/解除分配的字节
和/或堆栈 (B),这对于非常短时间运行的程序和测试很有用
目的,因为它在不同的机器上是最可重复的。

--详细频率= [默认: 10]
详细快照的频率。 和 --详细频率=1,每个快照都很详细。

--max-snapshots= [默认: 100]
记录的最大快照数。 如果设置为 N,对于所有程序,除了非常
短期运行的快照的最终数量将在 N/2 和 N 之间。

--massif-out-file= [默认: 地块.out.%p]
将配置文件数据写入文件而不是默认输出文件,
地块。 . 这 %p%q 格式说明符可用于嵌入进程 ID
和/或名称中环境变量的内容,就像
核心选项 --日志文件.

SG检查 配置


目前没有特定于 SGCheck 的命令行选项。

BBV 配置


--bb-out-file= [默认: bb.out.%p]
此选项选择基本块矢量文件的名称。 这 %p%q 格式
说明符可用于嵌入进程 ID 和/或环境的内容
名称中的变量,就像核心选项的情况一样 --日志文件.

--pc-out-file= [默认: 电脑输出。%p]
此选项选择 PC 文件的名称。 该文件保存程序计数器地址
和各种基本块的函数名称信息。 这个可以结合使用
使用基本块向量文件通过函数名称进行快进,而不仅仅是
指令计数。 这 %p%q 格式说明符可用于嵌入进程
ID 和/或名称中环境变量的内容,就像
核心选项 --日志文件.

--间隔大小= [默认: 100000000]
此选项选择要使用的间隔大小。 默认为100亿
指令,这是一个常用的值。 可以使用其他尺寸; 较小
间隔可以帮助具有更细粒度阶段的程序。 然而较小的间隔大小
由于预热效果可能会导致准确性问题(当快进各种
架构特性将被未初始化,并且需要一定数量的
在他们“热身”到完全模拟状态之前的指令
快进。 大的间隔大小往往会减轻这种情况。)

--仅指令计数 [默认: 不]
此选项告诉工具只显示指令计数总数,而不显示
生成实际的基本块矢量文件。 这对于调试很有用,对于
在不生成大的基本块向量的情况下收集指令计数信息
文件。

走狗 配置


--基本计数= [默认: 是的]
启用后,Lackey 会打印以下统计信息和有关
客户端程序的执行:

1. 指定函数的调用次数 --fnname 选项(默认
是主要的)。 如果程序的符号已被剥离,则计数将始终为
零。

2.遇到条件分支的数量和数量和比例
那些被带走的。

3. 程序输入并完成的超级块数。 请注意,由于
由 JIT 完成的优化,这根本不是一个准确的值。

4.guest数(x86、amd64、ppc等)指令和IR声明
执行。 IR 是 Valgrind 的类 RISC 中间表示,通过它所有
仪表完成。

5. 其中一些计数之间的比率。

6. 客户端程序的退出代码。

--详细计数= [默认: 不]
启用后,Lackey 会打印一个包含加载、存储和 ALU 计数的表格
操作,按其 IR 类型区分。 IR 类型由它们的 IR 标识
名称(“I1”、“I8”、...“I128”、“F32”、“F64”和“V128”)。

--trace-mem= [默认: 不]
启用后,Lackey 会打印几乎每个内存访问的大小和地址
该程序。 详情请参阅文件缺乏/lk_main.c 顶部的注释
关于输出格式、它是如何工作的以及地址跟踪中的不准确之处。 笔记
这个选项会产生大量的输出。

--trace-superblocks= [默认: 不]
启用后,Lackey 会打印出每个超级块的地址(单个条目,
由程序执行的多个出口,线性代码块)。 这主要是
Valgrind 开发人员的兴趣。 查看文件顶部的注释
缺少输出格式的详细信息/lk_main.c。 请注意,此选项会产生
大量的输出。

--fnname= [默认: 主要的]
更改在以下情况下计算调用的函数 --基本计数=是 已指定。

使用 onworks.net 服务在线使用 valgrind


免费服务器和工作站

下载 Windows 和 Linux 应用程序

Linux 命令

Ad




×
广告
❤️在这里购物、预订或购买——免费,有助于保持服务免费。