如何排除某些子进程在valgrind下运行?

kum*_*mar 7 linux valgrind

我正在Linux中运行一个守护进程,我想在valgrind下运行这个守护进程来查找与内存相关的错误.由于它是一个守护进程,我需要使用--trace-children=yes选项,但是这会在以后的生命周期中生成许多进程,我不希望它们在valgrind下运行.有没有办法排除某些孩子在valgrind下运行?

mar*_*k4o 6

当前发布的版本(valgrind 3.5.0)无法跟踪某些但不是所有子项.但是,如果您愿意使用SVN存储库中的最新代码,则它包含用于此目的的新选项 --trace-children-skip:

--trace-children-skip=patt1,patt2

此选项仅在--trace-children=yes指定时生效.它允许跳过一些孩子.该选项采用逗号分隔的模式列表,用于Valgrind不应跟踪的子可执行文件的名称.这些模式可以包括元字符?*,它们具有通常的意义.

这对于从Valgrind上运行的进程树中修剪不感兴趣的分支非常有用.但是在使用它时你应该小心.当Valgrind跳过跟踪到可执行文件时,它不仅会跳过跟踪该可执行文件,还会跳过跟踪任何可执行文件的子进程.换句话说,该标志不仅仅导致跟踪停止在指定的可执行文件中 - 它会跳过以任何指定可执行文件为根的整个进程子树的跟踪.

较旧的方法是省略--trace-children=yes,并且对于您想要跟踪的子项,将其替换为在valgrind下运行实际程序的简单脚本:

#!/bin/sh
exec valgrind --log-file=myprog.vg.%p myprog-real "$@"
Run Code Online (Sandbox Code Playgroud)

即使使用新选项,如果您想要在valgrind下跟踪但希望跳过其父级的孙子,这种脚本也很有用.