2012-05-12 7 views
0
는 실행 된 명령의 실제 경로를 포함하는 심볼릭 링크를 그대로 man 페이지/proc 디렉토리/PID/EXE 당

.. 리눅스/proc 디렉토리는 Valgrind의

내 프로그램에 Valgrind의 실행

, 나는 EXE를 를 참조 &// 그 은/proc/PID/EXE 는/usr/lib64에/Valgrind의/AMD64-리눅스에 점/memcheck

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

어떤 생각을 왜은/proc/PID/EXE 포인트 USR/lib64에/Valgrind의/AMD64 내가 valgrind를 호출 할 때 -linux/memcheck?

내 코드에서 실행 파일 이름을 얻으려고하는데,이 경우에는 valgrind를 기대하고 있습니다.

+0

아니요, 이미 확인했습니다. -rwxr-xr-x 1 루트 루트 40020 4 월 13 일 2006/usr/bin/valgrind – Manohar

+0

valgrind bina ry 그냥 프론트 엔드, 그것은 무엇을 해야할지 알아낼거야, 그리고 exec 실제 도구, 귀하의 경우에 memcheck – nos

+0

@nos, 어쨌든 나는 memcheck을 직접 호출 할 수 있습니까? 내가 가진 요구 사항은 프로그램이 호출 된 후이다. 나는 pid에서 프로그램 이름을 찾아야 만한다. 그리고/proc/pid/exe가 사용자가 실제로 그것을 어떻게 호출했는지 기대하고있다. (ofcourse/proc/pid/exe는 – Manohar

답변

1

memcheck은 다른 도구 (예 : callgrind)를 사용하지 않는 한 Valgrind에서 사용하는 기본 도구입니다.

--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 
+0

나는 그것을 이해합니다.하지만 valgrind a.out을 호출하면/proc/pid/exe는/usr/bin/valgrind에 대한 symblink가 될 예정입니까? – Manohar

+0

아니요, 실행되는 실제 바이너리에 대한 심볼릭 링크입니다. 'strace'는 무슨 일이 일어나고 있는지 밝혀 줄 것입니다. 결국'memcheck'는 에뮬레이터처럼 동작하므로 프로그램을 실행하는 프로그램입니다. Btw :이 경우 귀하의 질문은 정확하지 않습니다. – 0xC0000022L