Linux straceは-f(マルチスレッド親)を使用しても子プロセスを追跡しません。

Linux straceは-f(マルチスレッド親)を使用しても子プロセスを追跡しません。

注:いくつかの同様の質問があり、一般的な答えは「マルチスレッドプロセスを追跡するか、サブプロセスを追跡するには-fを使用してください」です。すでに-fを使用しているので、これは役に立ちません。

サブプロセスを開始し、定期的にスクリプトを実行するJavaアプリケーションを追跡する必要があります。スクリプトに提供されたコマンドライン引数を見たいです。ここで説明するには複雑すぎて仕上げることはできません。

私の問題は、Javaプロセスを追跡するとclone()システムコールを見ることができますがclone()

以下は最小限のテストプログラムです:

package exectest;
import java.io.IOException;
public class Exectest {
    public static void main(String[] args) {
        for (;;) {
            createProcess();
            try {
                Thread.sleep(15000);
            } catch (InterruptedException ex) {
                ;
            }
        }
    }
    static void createProcess()  {
        String[] params;
        params=new String[100000];
        for (int i=0; i<100000; i++) {
            params[i]=Integer.toString(i);
        }
        params[0]="echo";
        params[1]="test";
        try {
            Runtime.getRuntime().exec(params);
        } catch (IOException ex) {
            ;
        }
    }
}

これを実行してトレースを開始すると、次のようになります。

# /path/to/java -version
java version "1.6.0_81"
Java(TM) SE Runtime Environment (build 1.6.0_81-b08)
Java HotSpot(TM) 64-Bit Server VM (build 20.81-b05, mixed mode)
# /path/to/java -jar /tmp/exectest.jar &
[1] 143280
# strace -tt -e '!futex' -f -p 143280
[pid 143281] 14:16:11.146692 mmap(NULL, 1052672, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fb0a070d000
[pid 143281] 14:16:11.146767 clone(child_stack=0x7fb0a080cff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fb0a080d9d0, tls=0x7fb0a080d700, child_tidptr=0x7fb0a080d9d0) = 143981
[pid 143281] 14:16:26.177072 mmap(NULL, 1052672, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fb0a060c000
[pid 143281] 14:16:26.177150 clone(child_stack=0x7fb0a070bff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fb0a070c9d0, tls=0x7fb0a070c700, child_tidptr=0x7fb0a070c9d0) = 144187

プロセスを停止するまでこの操作を繰り返します。子プロセスには何も表示されません。示されているように、呼び出しを実行するのは「デフォルト」スレッドではなく143281サブスレッドです。clone()ただし、サブスレッドを追跡しようとすると、straceは新しいプロセスに従いますが、SIGTRAPを使用してしばらくして親プロセスを終了します。

# strace -tt -e '!futex' -f -p 143281 
....
[pid 143281] 14:19:26.529955 mprotect(0x7fb0a8107000, 4096, PROT_READ|PROT_WRITE) = 0
[pid 143281] 14:19:26.530049 mprotect(0x7fb0a8108000, 4096, PROT_READ|PROT_WRITE) = 0
[pid 143281] 14:19:26.530084 mmap(NULL, 1052672, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fb045b6a000
[pid 143281] 14:19:26.530147 clone(Process 146745 attached
child_stack=0x7fb045c69ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fb045c6a9d0, tls=0x7fb045c6a700, child_tidptr=0x7fb045c6a9d0) = 146745
[pid 146745] 14:19:26.530275 set_robust_list(0x7fb045c6a9e0, 0x18) = 0
[pid 146745] 14:19:26.530322 gettid()   = 146745
....
[pid 143307] 14:19:26.589462 --- SIGTRAP (Trace/breakpoint trap) @ 0 (0) ---
Process 143307 detached
[pid 146746] 14:19:26.589595 write(1, " 8414 8415 8416 8417 8418 8419 8"..., 4096) = 4096
[pid 146746] 14:19:26.590052 write(1, "9233 9234 9235 9236 9237 9238 92"..., 4096 <unfinished ...>
[pid 146358] 14:19:26.590751 +++ killed by SIGTRAP +++
[pid 146746] 14:19:26.590765 <... write resumed> ) = 4096
[pid 146745] 14:19:26.590775 +++ killed by SIGTRAP +++
[pid 146541] 14:19:26.590781 +++ killed by SIGTRAP +++
[pid 146176] 14:19:26.590787 +++ killed by SIGTRAP +++
[pid 145811] 14:19:26.590792 +++ killed by SIGTRAP +++
[pid 145408] 14:19:26.590797 +++ killed by SIGTRAP +++

これは、RHELが提供するstraceを持つRHEL6システムとUbuntu 14.04 LTSシステムからコピーされたstraceバイナリで発生します。

私が逃した部分はありますか?設定する必要があるstraceオプションはありますか? straceのバグや私が認識しない一般的な制限はありますか?どんなアイデアがありますか?

関連情報