straceがシェル機能を見つけられず、「Can't stat」エラーが発生します。

straceがシェル機能を見つけられず、「Can't stat」エラーが発生します。

funk_aユーザー定義関数を呼び出そうとしてもstrace見つかりません。 funk_aが自分で呼び出すことができることを確認しました。どんな意見でも感謝します。

$ source ./strace_sample.sh 
$ funk_a
Earth, Wind, Fire and Water
$ funk_b
Get on up
strace: Can't stat 'funk_a': No such file or directory

$ dpkg -p strace|grep Vers
Version: 4.8-1ubuntu5
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.5 LTS
Release:        14.04
Codename:       trusty

strace_sample.sh

#!/bin/bash

function funk_a {
  echo "Earth, Wind, Fire and Water"
}

function funk_b {
  echo "Get on up"
  strace -o trace_output.txt -c -Ttt funk_a
}

ありがとうございます。

ベストアンサー1

stracestrace実行可能ファイルのみ可能です。

funk_aは関数、つまりシェルのプログラミング構成であり、実行できるものではありません。

追跡できる唯一のことは、strace関数本体を評価する新しいシェルです。たとえば、次のようになります。

strace -o trace_output.txt -Ttt bash -c "$(typeset -f funk_a); funk_a"

-c(意味がないので削除しました-Ttt。)

ただし、この関数によって実行されたシステム呼び出しに加えて、ロードおよび初期化bash中(およびクリーンアップおよび終了後)に実行されたすべてのシステム呼び出しも表示できます。writefunk_a

あるいは、straceシェルが評価したときに関数のpidを追跡することもできますfunk_a

strace -o trace_output.txt -Ttt -p "$$" &
funk_a
kill "$!"

ただし、シェルのPIDに追加されると、シェルがstrace関数の解釈を完了した可能性が高くなります。次の同期を試すことができます。

strace -o trace_output.txt  -Ttt -p "$$" &
tail -F trace_output.txt | read # wait for some output in trace_output.txt

funk_a
kill "$!"

ただし、この場合も、タイミングによってtrace_output.txt使用されるシステムコールのいくつかの説明が含まれているか、コマンドトレースが出力ファイルに書き込まれるまでに終了するtail|readことがあります。killstraceecho

より良いアプローチは、2つの識別可能なシステムコール間で呼び出しをラップすることですfunk_a

strace -fo >(sed -n '1,\|open("///dev/null|d
                     \|open("/dev///null|q;p' > trace_output.txt
  ) -Ttt -p "$$" &
sleep 1 # give enough time for strace to start
exec 3<  ///dev/null # start signal
funk_a
exec 3< /dev///null # end signal

おすすめ記事