如何在没有通过valgrind命令选项启动它的情况下对每个Process实例执行valgrind memcheck。
有没有办法让监控选项保存在进程上,而不是每次使用valgrind命令启动进程?
在Microsoft Application Verifier中,如果指定要监视某个应用程序,则会监视该应用程序的任意数量的实例,无论是子进程还是以其他方式启动。
在Valgrind做任何想法?
我已经尝试过--trace-children =是valgrind memcheck的选项...但是我的应用程序xyz发出另一个应用程序zzz信号来启动xyz(进程)的新内容,我想分析它。在这种情况下,当xyz完成信号zzz时,valgrind退出。它没有跟进zzz开始的过程。
谢谢, 维杰
答案 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。