얼렁 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
으로 표시되는 이유는 무엇입니까?
굉장! 예,'strace -p 1166 -s 99999 -f -e '로 메모리 주소 출력을 얻었습니다. verbose =! writev'-e 'raw = writev'-e 'trace = writev'2>> (tee syscalls.txt)' –