linux / proc / <pid> / exe&amp;的valgrind </PID>

时间:2012-05-12 02:03:14

标签: linux valgrind

根据手册页/ proc / pid / exe是一个符号链接,包含已执行命令的实际路径..

当我在我的程序上运行valgrind时,我看到 / proc / pid / exe 指向 / usr / lib64 / valgrind / amd64-linux / memcheck

lnx-host> which valgrind
/usr/bin/valgrind

当我将它调用为valgrind时,为什么/ proc / pid / exe指向usr / lib64 / valgrind / amd64-linux / memcheck?

在我的代码中,我试图从pid中获取可执行文件名,并且在这种情况下期望看到valgrind。

1 个答案:

答案 0 :(得分:2)

memcheck是Valgrind使用的默认工具,除非您告诉它使用其他工具,例如callgrind

使用--tool=<name>指定要调用的工具。

旁注:你的/usr/bin/valgrind也是一个默认情况下的脚本吗?为什么不玩那样做你想要实现的目标?在我的系统上首先调用/usr/bin/valgrind.bin然后调用相应的(后端)工具(/usr/lib/valgrind/memcheck-amd64-linux)。


strace的相关输出:

execve("/usr/bin/valgrind", ["valgrind", "./myprog"], [/* 35 vars */]) = 0
stat("/home/user/HEAD/myprog", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
execve("/usr/bin/valgrind.bin", ["/usr/bin/valgrind.bin", "./myprog"], [/* 39 vars */]) = 0
open("./myprog", O_RDONLY)              = 3
execve("/usr/lib/valgrind/memcheck-amd64-linux", ["/usr/bin/valgrind.bin", "./myprog"], [/* 40 vars */]) = 0
getcwd("/home/user/HEAD/myprog", 4095) = 25
open("./myprog", O_RDONLY)              = 3
stat("./myprog", {st_mode=S_IFREG|0755, st_size=1886240, ...}) = 0
readlink("/proc/self/fd/3", "/home/user/HEAD/myprog/myprog", 4096) = 31
readlink("/proc/self/fd/3", "/home/user/HEAD/myprog/myprog", 4096) = 31
open("./myprog", O_RDONLY)              = 3
write(1015, "./myprog", 8)              = 8
write(1016, "==23547== Command: ./myprog\n", 28==23547== Command: ./myprog
stat("/home/user/HEAD/myprog/myprog", {st_mode=S_IFREG|0755, st_size=1886240, ...}) = 0
open("/home/user/HEAD/myprog/myprog", O_RDONLY) = 3
stat("/home/user/HEAD/myprog/myprog", {st_mode=S_IFREG|0755, st_size=1886240, ...}) = 0
open("/home/user/HEAD/myprog/myprog", O_RDONLY) = 3
open("/home/user/HEAD/myprog/myprog", O_RDONLY) = 3
readlink("/proc/self/fd/3", "/home/user/HEAD/myprog/myprog", 4096) = 31
getcwd("/home/user/HEAD/myprog", 4096) = 25
lstat("/home/user/HEAD/myprog/myprog", {st_mode=S_IFREG|0755, st_size=1886240, ...}) = 0
open("/home/user/HEAD/myprog/datafile", O_RDONLY) = 3
access("/home/user/HEAD/myprog/datafile", F_OK) = 0
open("/home/user/HEAD/myprog/datafile", O_RDONLY) = 3
open("/home/user/HEAD/myprog/datafile", O_RDONLY) = 4

您会注意到所有execve调用都不是指./myprog,而是指Valgrind包装器脚本,二进制文件,然后是后端工具:

execve("/usr/bin/valgrind", ["valgrind", "./myprog"], [/* 35 vars */]) = 0
execve("/usr/bin/valgrind.bin", ["/usr/bin/valgrind.bin", "./myprog"], [/* 39 vars */]) = 0
execve("/usr/lib/valgrind/memcheck-amd64-linux", ["/usr/bin/valgrind.bin", "./myprog"], [/* 40 vars */]) = 0