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
strace
strace
実行可能ファイルのみ可能です。
funk_a
は関数、つまりシェルのプログラミング構成であり、実行できるものではありません。
追跡できる唯一のことは、strace
関数本体を評価する新しいシェルです。たとえば、次のようになります。
strace -o trace_output.txt -Ttt bash -c "$(typeset -f funk_a); funk_a"
-c
(意味がないので削除しました-Ttt
。)
ただし、この関数によって実行されたシステム呼び出しに加えて、ロードおよび初期化bash
中(およびクリーンアップおよび終了後)に実行されたすべてのシステム呼び出しも表示できます。write
funk_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
ことがあります。kill
strace
echo
より良いアプローチは、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