オプション 1 は、呼び出し元アプリのソース コードを変更し、tee
を挿入することです。
オプション 2 は、問題の実行可能ファイルの周りにラッパー スクリプトを記述することです。 stdin と引数を実際のアプリに渡し、tee が出力をレビュー用の場所に渡し、アプリと同じようにそれを吐き出す簡単なスクリプトは、ほんの数行で作成する必要があります。特別な場所に置き、その場所を PATH 変数の前に追加してから、アプリケーションを実行してください。
#!/bin/sh
cat - | /path/to/realapp [email protected] | tee /tmp/debug_output
strace
の下で呼び出すことにより、プログラムに関する多くの情報を取得できます。 .これは、プログラムが行うすべてのシステム コールを示しています。これは情報が多すぎる場合がありますが、何が問題なのかを見つけるのに非常に役立ちます。
アプローチ 1 は、大きなアプリケーションを strace
未満で実行することです .これにより、大量の出力が生成され、アプリケーションの速度が低下する可能性があります。
strace -s9999 -efile,process -f -o bigapp.strace bigapp
大きなアプリケーションがインタラクティブな場合は、それを開始して、計算をトリガーする準備ができたら strace を接続することをお勧めします。アプリケーションのプロセス ID、たとえば 12345 をメモして実行します
strace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345
その外部実行可能ファイルを観察するだけで十分な場合は、他の回答が既に示唆しているように、その実行可能ファイルをラッパー スクリプトに置き換えます。実行可能ファイルを別の名前に移動してその場所にラッパー スクリプトを配置するか、PATH
内の通常の実行可能ファイルの前にラッパー スクリプトを配置できます。 、または通常の実行可能ファイルの代わりにラッパースクリプトを呼び出すようにアプリケーションを構成します。そのラッパー スクリプトを作成します
#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "[email protected]"
使用される strace パラメータの説明:
-e
トレースするシステム コールを選択します。名前でシステム コールを指定するか、file
などのいくつかのカテゴリを使用できます。 (open
、close
、read
、write
、…) およびprocess
(fork
、execve
、…)-f
strace をフォークに追従させます。つまり、サブプロセスと元のプロセスをトレースします。-o
トレースを含むファイルの名前を選択します。$$
シェルプロセスのプロセス ID を表すシェル構造です (exec
の使用による) 最後のラッパー スクリプトでは、補助アプリケーションのプロセス ID にもなります)。-s9999
read
のバイト数を表示します とwrite
およびその他の呼び出し。
パスを変更するのではなく、関心のあるバイナリを「binary」から「binary.orig」に移動してから、スクリプトに置き換える必要があります。あなたは引数に興味があると言ったので、それらもファイルに書き出す必要があります。おそらく、コマンド「env」の出力にも興味があるでしょう。現在アクティブなすべての環境変数をダンプします。環境変数は、あるプログラムが呼び出す別のプログラムの動作に影響を与えるためによく使用されます。