यदि आप सोचते हैं कि कैसे strace
काम करता है तो यह पूरी तरह से समझ में आता है कि बाश के लिए कोई भी निर्माण ट्रेस करने योग्य नहीं होगा। strace
केवल वास्तविक निष्पादनों का पता लगा सकते हैं, जबकि निर्मित नहीं हैं।
उदाहरण के लिए, मेरी cd
आज्ञा:
$ type cd
cd is a function
cd ()
{
builtin cd "$@";
local result=$?;
__rvm_project_rvmrc;
__rvm_after_cd;
return $result
}
Std'ing cd के लिए ट्रिक?
मैं इस तकनीक के पार आया था जहाँ आप 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,
यह बैश प्रॉम्प्ट है, जहां यह वहां बैठा है, कुछ इनपुट की प्रतीक्षा कर रहा है। तो चलिए इसे आज्ञा देते हैं 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 ..
और एंटर दबाएं, ( \n
)। वहां से आप देख सकते हैं कि stat()
फ़ंक्शन को कॉल किया गया था, और उसके बाद बैश दूसरे read(0..
प्रॉम्प्ट पर बैठा है, एक और कमांड की प्रतीक्षा कर रहा है।
strace
एक कार्यक्रम नहीं चलाने के परिणामस्वरूप ट्रेस नहीं होता है?