2013-04-17 5 views
2

dtrace를 처음 사용하고 기본적인 dtrace 스크립팅을 작성하려고합니다. 나는 예를 발견하는 잡을 읽기 (2)와 별도의 터미널 (2) 시스템 콜을 작성하여 지정된 PID 번호가 다른 터미널의 PID 아이디에서입니다dtrace : 쓰기 sys 호출을 수신하지 않습니다.

syscall::read:entry, 
syscall::write:entry 
/pid==4217/ 
{ 

} 

, 다음과 같은. 이 예제를봤을 때 dtrace로이 스크립트를 실행하면 읽기 및 쓰기 시스템 콜을 일부 표시해야합니다. 하지만 나는 syscall을 읽었지만 syscall은 쓰지 않았다.

터미널에서 뭔가를 입력하면 커널이 해당 문자를 읽으므로 syscall이 발생한다고 가정합니다 (pid 4217). 내가 "ls"와 같이 타이핑하고 엔터를 치면 커널은 그것을 읽고 실행하고 터미널에 출력을 써서 syscall을 호출하여 쓸 수 있다고 쓴다. 하지만 필자는 어떤 방식 으로든 쓰기 시스템 호출을 보지 못했습니다. 왜 그런가요?

답변

0

@PaulFox에 동의합니다.이 값은 실수로 pid입니다. enter 키를 누르기 전에 터미널이 일시 중지되면 터미널은 read 시스템 콜의 중간에 있습니다. 그러나, 터미널 프롬프트를 인쇄 할 때 (Enter 키를 누르고 ls이 실행 된 후) write을 호출하여이를 수행합니다. ls의 출력은 write 시스템 콜이 들어오는 곳이 아닙니다. 그 pid은 실행중인 ls 명령의 프로세스 ID입니다. 그런 다음

# dtrace -n 'syscall::write:entry {printf("hello")}' 

을 대상으로 (당신이 사용하고 무엇 이건 'bash는'대체) 터미널과 그것을 시도 :

write 콜이 실제로 작동하는지 테스트하려면 다음을 실행

# dtrace -n 'syscall::write:entry /pid==$target/ {printf("hello")}' -c 'bash' 

그리고 터미널에 물건을 입력하는 동안 그 중 하나가 쓰기를 표시하지 못하면 다시 게시하십시오.

# dtrace -ln 'syscall::*write*:entry' 
    ID PROVIDER   MODULE       FUNCTION NAME 
    147 syscall            write entry 
    381 syscall            writev entry 
    447 syscall            pwrite entry 
    777 syscall           aio_write entry 
    933 syscall          write_nocancel entry 
    963 syscall          writev_nocancel entry 
    969 syscall          pwrite_nocancel entry 
:

또한 (내가 놀랄 것입니다하지만 그것은 보통 write이 아닌 다른 뭔가를 사용하는 경우) 쉘이 사용하고있는 쓰기 콜 여러 버전의주의

1

먼저 다른 프로세스 (예 : 다른 프로세스)에서 write()가 작동하는지 확인합니다. 간단한 테스트 케이스. 예를 들어, (a) 잘못된 pid 나 그 자식이 글쓰기를하고 있거나, (b) 쓰기 호출이 사용되지 않았을 수도 있습니다. writev() 또는 다른 호출 (아마도 strace를 사용하여 유효성을 검사 해보십시오).