-T
및 -U
옵션 에 해당하는 것이 있습니까?truss
Solaris 유틸리티는 Linux에서 이 작업을 수행합니다.
이는 추적되는 응용 프로그램이 호출할 때 응용 프로그램을 중지시키는 시스템 호출( -T
) 또는 라이브러리 함수( )를 지정하는 데 사용됩니다 .-U
즉, 추적된 응용 프로그램에 의해 시작된 모든 프로세스가 주어진 시스템 호출이나 주어진 공유 라이브러리 함수 호출을 하는 즉시 중지(SIGSTOP에 의해 종료된 것처럼)되기를 원합니다.
strace
ltrace
대부분의 Solaris 기능 세트는 Linux에서 사용할 수 있지만 그렇게 truss
하지 않는 것 같습니다.
예를 들어:
truss -f -T open cmd
strace -f cmd
실행 중인 프로세스 cmd
나 그 하위 프로세스가 시스템 호출을 수행하는 경우를 제외하고 는 open
즉시 중지됩니다. (나중에 편의에 따라 다시 시작할 수 있습니다.)
어떤 경우에는 '를 사용할 수 있지만 gdb
포크를 쉽게 추적하고 s 이후에도 포크된 모든 프로세스에 대해 이 작업을 계속 수행할 수 있는 솔루션을 찾고 있었습니다 catch syscall
.execve
일부 유틸리티는 특정 원격 시스템 호출 사이의 단일 단계 실행을 위해 동일한 기능 또는 기능(또는 동일한 유틸리티에 대한 옵션)을 제공했지만 기억력이 좋지 않고 확실하지도 않습니다. 그건 리눅스에 있어요.
답변1
내가 아는 한, 내부적으로 사용되는 함수 strace
나 호출 시에는 이 작업을 수행할 수 없습니다.ptrace
SIGSTOP
SIGINT
편집하다:
이 간단한 솔루션을 삽입했습니다.사역이므로 인코딩이 필요하지 않습니다.
strace의 모든 기능이 필요하지 않은 경우 제가 제안하는 해결책은 ministrace를 수정하는 것입니다. 여기에서 찾았습니다.70줄의 코드로 추적을 직접 작성해 보세요..
일회성 프로그램에서는 다음 코드 앞에 두 줄을 추가할 수 있습니다.
if (wait_for_syscall(child) != 0) break;
의사코드:
if(syscall == SYS_write)
do {
char str[4];
gets(str); // waits until enter to continue
} while(0);
아직 테스트하지 않았으므로 최종 단계는 여러분에게 맡깁니다.
답변2
Systemtap은 당신이 찾고 있는 것을 할 수 있어야 합니다. 여기에 좋은 가이드가 있습니다: