참고: 몇 가지 유사한 질문이 있으며 일반적인 대답은 "멀티 스레드 프로세스를 추적하거나 하위 프로세스를 추적하려면 -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의 버그나 제가 인식하지 못하는 일반적인 제한 사항이 있습니까? 어떤 아이디어가 있나요?