3

如何在不通过 valgrind 命令选项启动的情况下对 Process 的每个实例进行 valgrind memcheck。

有没有办法将监视选项保存在进程中,而不是每次都使用 valgrind 命令启动进程?

在 Microsoft Application Verifier 中,如果指定要监视应用程序,则该应用程序的任意数量的实例都会受到监视,无论它是子进程还是以其他方式启动。

有什么想法可以在 Valgrind 中做同样的事情吗?

我已经尝试了 valgrind memcheck 的 --trace-children=yes 选项......但是我的应用程序 xyz 向另一个应用程序 zzz 发出信号,以启动我想分析的 xyz(进程)的新实例。在这种情况下,当 xyz 完成发送 zzz 信号时,valgrind 退出。它不会跟进 zzz 启动的进程。

谢谢,维杰

4

3 回答 3

5

IIRC,Valgrind 必须执行应用程序,因为它会更改只读符号以替换常见的库函数等malloc

这意味着您不能将 memcheck 附加到已经运行的进程,因为它无法更改内存中程序的该部分(并且它可能会破坏运行状态)。

可能还有其他原因。一个快速的谷歌建议您也不能将 memcheck 附加到正在运行的进程。如建议的那样,您可以将可执行文件包装在 bash 脚本中,例如。因此,如果程序myprog创建了新进程,newprog则执行以下操作:

]$ mv /path/to/myprog /path/to/newprog

然后

#!/bin/bash
valgrind (options) /path/to/newprog $@

并将其myprog称为$@确保参数被传递。然后当你的程序创建一个新进程时,使用myprog -a b -c dthen 它被包装在 valgrind 中。

这仅适用于某些 C 调用execve()和其他调用,而其他创建进程的晦涩方式可能无法利用包装。

如果我错了,知道这将是一件好事:)

于 2009-08-06T11:47:42.947 回答
2

您可以将其包装xyz在批处理文件或另一个在 valgrind 中启动它的可执行文件中吗?

换句话说,重命名xyzrun_me_under_valgrind,然后创建一个新的,在 valgrind 下xyz启动原来的。run_me_under_valgrind

于 2009-08-06T11:47:54.287 回答
0

关于包装器可执行文件,我已经为 PostgreSQL 找到了以下脚本。(我已经删除了各种特定于 postgres 的部分,例如发现提供的 valgrind 抑制文件)。

#!/bin/bash
set -e -u -x

# Pop top two elements from path; the first is added by pg_regress
# and the next is us.
function join_by { local IFS="$1"; shift; echo "$*"; }
IFS=':' read -r -a PATHA <<< "$PATH"
export PATH=$(join_by ":" "${PATHA[@]:2}")

NEXT_POSTGRES=$(which postgres)
if [ "${NEXT_POSTGRES}" -ef "./valgrind/postgres" ]; then
    echo "ERROR: attempt to execute self"
    exit 1
fi

echo "Running ${NEXT_POSTGRES} under Valgrind"

valgrind --leak-check=full --show-leak-kinds=definite,possible \
    --gen-suppressions=all --verbose --time-stamp=yes  \
    --log-file=valgrind-$$-%p.log --trace-children=yes \
    --track-origins=yes --read-var-info=yes --malloc-fill=8f \
    --free-fill=9f --num-callers=30 postgres "$@"

注意PATH操作以确保我们不会再次尝试postgres从同一个地方执行。在这种情况下,包装脚本也必须准确命名,postgres因此我必须确保它不会递归执行它自己。

另一种方法是使用whatis -a在路径中查找下一个可执行文件并直接运行它。但我发现这对我的用例造成了其他问题。


顺便说一句,如果您收到类似的错误

   valgrind: mmap(0x58000000, 2347008) failed in UME with error 22 (Invalid argument).
   valgrind: this can be caused by executables with very large text, data or bss segments.

...那么您很可能会错误地尝试在 valgrind 下运行 valgrind 。

于 2018-02-19T07:14:00.883 回答