Si vous pensez à comment cela strace
fonctionne, il est tout à fait logique qu'aucun des éléments intégrés à Bash ne soit traçable. strace
ne peut suivre que les exécutables réels, contrairement aux buildins.
Par exemple, ma cd
commande:
$ type cd
cd is a function
cd ()
{
builtin cd "$@";
local result=$?;
__rvm_project_rvmrc;
__rvm_after_cd;
return $result
}
Astuce pour strace'ing cd?
Je suis tombé sur cette technique où vous pouviez invoquer strace
le bash
processus réel et, ce faisant, tracer indirectement de cd
cette façon.
Exemple
$ stty -echo
$ cat | strace bash > /dev/null
Ce qui me permet d'être en mesure de structurer le bash
processus comme suit:
....
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,
Il s'agit de l'invite Bash, où elle se trouve là, en attente d'une entrée. Donnons-lui donc la commande 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,
De la sortie ci-dessus, vous pouvez voir où j'ai tapé la commande cd ..
et appuyer sur Entrée, ( \n
). De là, vous pouvez voir que la stat()
fonction a été appelée et qu'ensuite Bash est assis à une autre read(0..
invite, attendant une autre commande.
strace
de ne pas exécuter un programme n'entraîne pas de trace?