Nếu bạn nghĩ về cách thức strace
hoạt động thì điều đó hoàn toàn có ý nghĩa rằng không có nội dung nào trong Bash sẽ có thể truy nguyên được. strace
chỉ có thể theo dõi các thực thi thực tế, trong khi các nội dung thì không.
Ví dụ cd
: lệnh của tôi :
$ type cd
cd is a function
cd ()
{
builtin cd "$@";
local result=$?;
__rvm_project_rvmrc;
__rvm_after_cd;
return $result
}
Thủ thuật cho cd strace'ing?
Tôi đã xem qua kỹ thuật này, nơi bạn có thể gọi ra quy trình strace
thực tế bash
và bằng cách đó, gián tiếp theo dõi theo cd
cách đó.
Thí dụ
$ stty -echo
$ cat | strace bash > /dev/null
Kết quả là tôi có thể bash
tiến hành quá trình như sau:
....
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,
Đây là dấu nhắc Bash, nơi nó đang ngồi đó, chờ đợi một số đầu vào. Vì vậy, hãy cho nó lệnh 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,
Từ đầu ra trên, bạn có thể thấy nơi tôi đã gõ lệnh cd ..
và nhấn enter, ( \n
). Từ đó bạn có thể thấy rằng stat()
hàm đã được gọi và sau đó Bash đang ngồi ở một read(0..
dấu nhắc khác , chờ lệnh khác.
strace
không chạy chương trình không dẫn đến dấu vết?