web-dev-qa-db-ja.com

Linuxでの "truss -T"および "truss -U"と同等ですか?

Linuxで truss Solarisユーティリティの-Tおよび-Uオプションと同等の機能はありますか?.

これらは、システムコール(-T)またはライブラリ関数(-U)を指定して、トレースされたアプリケーションによって呼び出されると、アプリケーションを停止させます。

または、別の言い方をすると、特定のシステムコールまたは特定の共有ライブラリー関数の呼び出しを行うとすぐに、トレースされたアプリケーションによって開始されたプロセスを停止します(SIGSTOPによって強制終了されたかのように)。

Linuxのstraceltraceは、Solaris trussの機能セットの多くを備えていますが、実際にはそうではないようです。

例えば:

truss -f -T open cmd

strace -f cmdのようになりますが、cmdまたはその子孫のいずれかを実行しているプロセスがopenシステムコールを実行すると、すぐに停止します(後で再開できます)。私の都合)

場合によっては、gdbcatch syscallを使用することもできますが、フォークを便利に追跡し、フォークされたすべてのプロセスに対してそれを続行し、execves。

同じ機能を提供しているユーティリティ、またはシステムコールがリモートで発生している間にシングルステップアプリケーションに1つ(または同じユーティリティのオプション)を提供しているユーティリティを思い出しているようですが、メモリに問題があり、確信が持てません。それはLinux上でした。

12

私の知る限りでは、これはstraceでは実行できません。内部で使用されるptrace関数は、呼び出し時にSIGSTOPまたはSIGINTを実行します。

編集:

この簡単なソリューションを ministrace に挿入したので、コーディングは必要ありません。

私の提案する解決策は、straceのすべての機能が必要なわけではない場合、ここで見つけたministraceを変更することです 70行のコードでstraceを自分で記述してください

ワンショットプログラムでは、次のコードの前に2行追加できます。

if (wait_for_syscall(child) != 0) break;

疑似コード:

if(syscall == SYS_write)
    do {
        char str[4];
        gets(str);  // waits until enter to continue    
    } while(0);

私はこれをいじらなかった、これらの最後のステップはあなたに任されている。

3

Systemtapはあなたが探していることを実行できるはずです、それはそれのための素晴らしいガイドです:

https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/SystemTap_Beginners_Guide/

2
replay