2017-06-24 27 views
2

私はDTraceを使って、 "自分のシェルスクリプトによって作られたシステムコール"を見たいと思っていました。script.shの実行に失敗しました:不明なエラー

私はshell.sh、非常に単純なシェルスクリプトを作って、それが実行権限を与えた:

#!/bin/bash 
grep 1 <<< 123 

私はcd「そのディレクトリにD、およびこの単純なDTraceスクリプト走った:私は

sudo dtrace -n 'syscall:::entry 
/pid == $target/ 
{ 
    @[probefunc] = count(); 
}' -c ./trace-me.sh 

をこのエラー出力を取得します。

dtrace: failed to execute ./trace-me.sh: unknown error 

ここで何が起こったのですか?私はcsrutil enable --without dtraceを実行しました。 -c argを削除して、$targetをpidに置き換えると、DTraceスクリプトはうまく動作します。

これはちょうど別のMacの問題ですか?私はmacOS Sierra 10.12.5 Betaを実行しています。

+1

この回答を見ると、問題が解決する可能性があります。https://stackoverflow.com/a/36760408/499581 –

答えて

1

@ l'L'lリンク先のtipのおかげで、私はこれを回避することができました。

2つのシェルが必要です。シェルA(我々が検査されますシェル)で

:シェルB(DTraceの実行されるシェル)で

# copy this shell's PID to clipboard (93827 for this example) 
echo $$ | pbcopy 

、そのPIDトレースを開始:私たちは、使用

sudo dtrace -n 'syscall:::entry 
/progenyof($1) && pid != $1/ 
{ 
    @[probefunc] = count(); 
}' 93827 

progenyof()を使用して、子プロセスのシェルのを確実にトレースします。何らかの理由でprogenyof(x)xが含まれているようですので、&& pid != $1を追加しました。バックシェルAで今すぐ

、あなたが点検したいのですが、いくつかのコードを実行します。

grep 1 <<< 123 

シェルBにおける当社のDTraceのプログラムが正常にシェルAに

を立ち上げた子プロセスをキャッチしますありますノイズのビットはふるいにかける。多分、シェルは様々な子供たちを立ち上げるでしょう。どのように選択的にするかわからない。


それは

less "$(which dtruss)" 

関連条項...どのようにdtruss実装-f(「彼らはフォークされているよう子どもたちに従ってください」)を見て、教育だOPT_follow &&フィルタを使用したものが(-fが有効になっていることを示しています)またはself->child変数(このスレッドが-p PIDで指定されたプロセスの子であることを示します)。

ppidが、親PIDを提供する組み込み変数であることも知っておくと便利です。

関連する問題