【问题标题】:linux /proc/<pid>/exe & valgrindlinux /proc/<pid>/exe & valgrind
【发布时间】:2012-05-12 02:03:13
【问题描述】:

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

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

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

知道为什么 /proc/pid/exe 在我将其作为 valgrind 调用时指向 usr/lib64/valgrind/amd64-linux/memcheck 吗?

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

【问题讨论】:

  • 不是,我已经检查过了.. -rwxr-xr-x 1 root root 40020 Apr 13 2006 /usr/bin/valgrind
  • valgrind 二进制文件只是一个前端,它会弄清楚要做什么,并执行实际的工具,在你的情况下是 memcheck
  • @nos,那我可以直接调用 memcheck 吗?我的要求是在程序被调用之后,我必须从 pid 中找到程序名称,我希望 /proc/pid/exe 将匹配用户实际调用它的方式(当然 /proc/pid/exe 将是完整路径)
  • @Santhosh:我有点困惑,你的问题就像在调用 gcc 时要求查看它,并且惊讶于后端在不同的编译阶段被称为完全不同的东西。
  • 在一般情况下,不,用户可能已经调用了执行各种操作并最终执行某些操作的 shell 脚本,或者在这种情况下,可执行文件本身会启动另一个工具 - 以及关于什么的信息调用的用户消失了。在用户直接调用您自己的可执行文件的特殊情况下,/proc/pid/exe 就是它。

标签: linux valgrind


【解决方案1】:

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

使用--tool=&lt;name&gt; 指定您要调用的工具。

旁注:您的/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

【讨论】:

  • 我明白.. 但是当我调用 valgrind a.out 时,/proc/pid/exe 应该是 /usr/bin/valgrind 的符号链接,不是吗?
  • 不,它是运行的实际二进制文件的符号链接。 strace 将阐明正在发生的事情。毕竟memcheck 就像一个模拟器,因此是运行你的程序的程序。顺便说一句:在这种情况下,您的问题不是很精确。
猜你喜欢
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 2010-12-19
  • 2020-12-01
相关资源
最近更新 更多