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

时间:2009-08-06 11:37:36

标签: valgrind memcheck

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

有没有办法让监控选项保存在进程上,而不是每次使用valgrind命令启动进程?

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

在Valgrind做任何想法?

我已经尝试过--trace-children =是valgrind memcheck的选项...但是我的应用程序xyz发出另一个应用程序zzz信号来启动xyz(进程)的新内容,我想分析它。在这种情况下,当xyz完成信号zzz时,valgrind退出。它没有跟进zzz开始的过程。

谢谢, 维杰

3 个答案:

答案 0 :(得分:4)

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

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

也可能有其他原因。 quick google表示您也无法将memcheck附加到正在运行的进程中。如建议的那样,您可以将可执行文件包装在bash脚本中,例如。因此,如果程序myprog创建newprog的新流程,则执行:

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

然后

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

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

这仅适用于execve()等其他C调用,而其他创建过程的模糊方法可能无法利用包装。

如果我错了,那就知道了。)

答案 1 :(得分:2)

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

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

答案 2 :(得分: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。