আপনি কীভাবে কীভাবে strace
কাজ করে সে সম্পর্কে যদি আপনি চিন্তা করেন তবে এটি মোটামুটি বোঝায় যে বাশের কাছে বিল্টিনগুলির কোনওটিই ট্রেসযোগ্য হবে না। 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,
এটি বাশ প্রম্পট, এটি সেখানে বসে কিছু ইনপুটটির জন্য অপেক্ষা করছে। সুতরাং আসুন এটি আদেশ দিন 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
একটি প্রোগ্রাম না চালানোর ফলে কোনও চিহ্ন পাওয়া যায় না?