0

マニュアルページによると、 /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 が表示されることを期待しています。

4

1 に答える 1

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
于 2012-05-12T02:08:01.537 に答える