GNU/Linux >> Linux の 問題 >  >> Linux

組み込みコマンドをbashするためにstraceすることは可能ですか?

「組み込みコマンドがメモリに読み込まれるのはいつですか」というタイトルのこの質問に触発されて、これに答えようとしているときに、次のコマンドを試しましたが、実行できなかったことに少し驚いていました。

$ strace cd $HOME

Bashへの組み込みコマンドのstraceを実行するために使用できる方法はありますか?

承認された回答:

straceの方法を考えると 動作する場合、Bashのビルトインはどれも追跡できないことは完全に理にかなっています。 strace 実際の実行可能ファイルのみをトレースできますが、組み込みファイルはトレースできません。

たとえば、私のcd コマンド:

$ type cd
cd is a function
cd () 
{ 
    builtin cd "[email protected]";
    local result=$?;
    __rvm_project_rvmrc;
    __rvm_after_cd;
    return $result
}

CDをstraceするためのトリック?

straceを呼び出すことができるこのテクニックに出くわしました 実際のbash プロセスとその際に、間接的にcdをトレースします そのように。

$ stty -echo
$ cat | strace bash > /dev/null

その結果、bashをstraceできるようになります 次のように処理します:

....
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.. プロンプト、別のコマンドを待っています。


Linux
  1. Bash bangコマンド:Linuxコマンドラインの必知のトリック

  2. バッシュ‘?

  3. Bashの完了が代替案を循環することは可能ですか?

  1. `builtin`ビルトインが必要ですか?

  2. Bashでの$#の使用は何ですか

  3. Bash でコマンドのグループをタイムアウトする方法

  1. Bashシェルのカスタマイズ

  2. Bashの「評価」コマンド?

  3. Bashビルトインコマンドの個々のマニュアルページを取得しますか?