2016-07-08 4 views
0

얼렁 VM이 어떻게 writev을 사용하는지 이해하려면 strace을 사용하려고합니다. 나는 시스템 호출에 관해서는 거의 알지 못한다. 나는 내가보고있는 것을 이해하려고 노력하고있다. writev이 부여되고 있음을 설명`writev` 호출에서 왜 메모리 주소를 보지 못합니까?

writev(0x1A, 0x1A5405F8, 0x4) 

그는 계속 : this article에서

은, 저자는 파일에 기록 작은 얼랑 프로그램을 추적하고,이 같은 시스템 호출을보고의 예를 보여줍니다 더 많은 메모리 주소를 포함하는 벡터의 메모리 주소. 아마도 운영 체제는 그 주소에서 데이터를 가져 와서 파일에 저장합니다.

내가 나 자신을 저자의 예를 시도 - (AN Ubunto 12.04 VM에) iex라는 엘릭서의 REPL에서 동일한 코드를 실행하고 이런 식으로 추적 : 그러나

# show me system calls for process 1166... 
# ... and show long output if necessary (the -s flag) 
# ... and also trace any child processes (the -f flag) 
# ... and I only care about calls to writev (the -e flag) 
# ... and capture standard error to a file (the >(tee ...)) 
strace -p 1166 -s 99999 -f -e writev 2> >(tee syscalls.txt) 

, 출력은이 같은 모습을 가지고 "다음 4 문자열을 쓰기 기술자 (11) 파일, 각 19 바이트 총, 길이와 함께 나열 할 수 있습니다."

writev(11, [{"Hello ", 6}, {"&", 1}, {"amp;", 4}, {" Goodbye", 8}], 4) = 19 

나는대로이 읽기

하지만 메모리 주소 대신 실제 문자열 값이 왜 표시됩니까? 주소에 의해 참조되는 대신 데이터가 복사되는 것을 의미합니까 아니면 단순히 어떻게 든 잘못 표시합니까?

strace이 과정에서 메모리 주소가 writev으로 표시되는 이유는 무엇입니까?

답변

1

strace가 계속 좋아지고 있습니다. 이제 임시 배열 주소를 로그 아웃하는 대신 로그에 유용한 정보를 남기는 내용을 실제로 알려줍니다.

당신은 -e verbose=!writev와 상세를 뒤집 strace를 위해 깃발을 가지고 작업을 시도 할 수 있습니다

이 - 쉘에 따라 어쩌면 인용에 필요에 대한주의 및/또는 ! 탈출 - (가능성이 당신의 임시 배열의 주소를 다시 줄 것이다, 당신이 인용 한 예에서와 같이) -e raw=writev으로 원시 디스플레이를 플립하고 당신이 얻는 것을보십시오.

디버거를 연결하고 writev 호출을 가로 챌 수도 있습니다. 이렇게하면 프로세스를 훑어보고 프로세스에서 커널로 전송되는 데이터를 검사 할 수 있습니다. (dtrace과 같은 동적 추적 유틸리티가 있다면 세계를 멈추지 않고도 비슷하게 만들 수 있습니다.)

+0

굉장! 예,'strace -p 1166 -s 99999 -f -e '로 메모리 주소 출력을 얻었습니다. verbose =! writev'-e 'raw = writev'-e 'trace = writev'2>> (tee syscalls.txt)' –