이 질문에서 영감을 얻었습니다 . 내장 명령이 메모리에로드 될 때 , 이것에 대답하는 동안 다음 명령을 시도했지만 실행할 수 없다는 것에 약간 놀랐습니다.
$ strace cd $HOME
내장 명령에 대해 strace를 실행하여 Bash에 사용할 수있는 방법이 있습니까?
이 질문에서 영감을 얻었습니다 . 내장 명령이 메모리에로드 될 때 , 이것에 대답하는 동안 다음 명령을 시도했지만 실행할 수 없다는 것에 약간 놀랐습니다.
$ strace cd $HOME
내장 명령에 대해 strace를 실행하여 Bash에 사용할 수있는 방법이 있습니까?
답변:
어떻게 strace
작동 하는지에 대해 생각한다면 Bash에 내장 된 어떤 것도 추적 할 수 없다는 것이 합리적입니다. strace
내장 파일은 그렇지 않지만 실제 실행 파일 만 추적 할 수 있습니다.
예를 들어, 내 cd
명령 :
$ type cd
cd is a function
cd ()
{
builtin cd "$@";
local result=$?;
__rvm_project_rvmrc;
__rvm_after_cd;
return $result
}
strace
실제 bash
프로세스를 호출 하여 간접적으로 추적 할 수있는이 기술을 발견했습니다 cd
.
$ stty -echo
$ cat | strace bash > /dev/null
결과적 bash
으로 다음과 같이 프로세스 를 밟을 수 있습니다.
....
getegid() = 501
getuid() = 500
getgid() = 501
access("/bin/bash", X_OK) = 0
stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=940312, ...}) = 0
geteuid() = 500
getegid() = 501
getuid() = 500
getgid() = 501
access("/bin/bash", R_OK) = 0
getpgrp() = 32438
rt_sigaction(SIGCHLD, {0x43e360, [], SA_RESTORER, 0x34e7233140}, {SIG_DFL, [], SA_RESTORER, 0x34e7233140}, 8) = 0
getrlimit(RLIMIT_NPROC, {rlim_cur=1024, rlim_max=62265}) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
fcntl(0, F_GETFL) = 0 (flags O_RDONLY)
fstat(0, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0,
이것은 Bash 프롬프트이며 거기에 앉아 입력을 기다립니다. 다음 명령을 드리겠습니다 cd ..
:
read(0, "c", 1) = 1
read(0, "d", 1) = 1
read(0, " ", 1) = 1
read(0, ".", 1) = 1
read(0, ".", 1) = 1
read(0, "\n", 1) = 1
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/saml", {st_mode=S_IFDIR|0700, st_size=32768, ...}) = 0
stat("/home/saml/tst", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/saml/tst/90609", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/saml/tst/90609", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
chdir("/home/saml/tst") = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0,
위 출력에서 명령을 입력 한 위치를 확인 cd ..
하고 Enter 키 ( \n
)를 누르십시오 . 거기에서 stat()
함수가 호출되었고 Bash가 다른 read(0..
프롬프트에 앉아 다른 명령을 기다리고 있음을 알 수 있습니다.
strace
프로그램을 실행하지 않는 것이 추적을하지 않는 것이 놀라운 일이라고 생각 하십니까?