dtruss
은 모두 DTrace 용으로 작성된 스크립트의 훌륭한 예이며 DTrace가 수행 할 수있는 방법을 보여줍니다. 그러나 상대적으로 불건전 한 OS X에 대한 truss
또는 strace
과의 유사성은 매우 환영 스럽지만, 나는 dtruss
이 둘 중 하나의 완전한 대체품이 될 수 없다고 생각합니다.
어쨌든 질문이 약간 모호합니다. 보시는 문자열이 잘리지 않거나 sendto()
또는 recvfrom()
(근원이되는 문자열)이 전혀 표시되지 않을지 잘 모르겠습니다. DTrace로 공개 된 인터페이스). 나는 둘 다 다룰 것이다.
첫째, DTrace는 커널에서 데이터를 수집합니다. 사용자 - 랜드 버퍼는 D 언어의 copyin()
또는 copyinstr()
으로 얻어지기 전에 기록되고 다시 소비자에게 전송됩니다. 일반적으로 dtrace(1)
명령입니다. DTrace는 컴파일시 커널 버퍼 크기를 알아야하기 때문에 예측할 수없는 길이의 문자열에 한계가 있습니다. 이 제한은 기본적으로 256 바이트입니다. 당신은 절단을보고있는 경우에 당신은 dtruss
의이 pragma
기존 이하, 예를 들면 추가하여
#pragma D option strsize=512
을 제한을 변경할 수 있습니다.
두 번째로 dtruss
은 다양한 시스템 호출의 형식 요구 사항을 알기 위해 하드 코딩되어 있습니다. sendto()
또는 recvfrom()
에 대한 버퍼 해석이 소스에서 명시 적으로 처리되지 않기 때문에 출력에 버퍼 해석이 표시되지 않습니다. 거기에 추가하기에 적합한 곳을 찾는 당신을 막을 아무것도 없습니다하지만 당신은 대신 자신의 스크립트를 작성할 수 있습니다 문자열로, 우리가 tracemem()
의 사용의 DTrace의에 하드 제한을 제공 할 의무가있는 것을
bash-3.2# cat sr.d
#pragma D option rawbytes
syscall::sendto:entry,
syscall::recvfrom:entry
/pid == $target/
{
self->bufp = arg1;
self->size = arg2;
}
syscall::sendto:return,
syscall::recvfrom:return
/pid == $target && self->bufp && self->size/
{
printf("%s():\n", probefunc);
tracemem(copyin(self->bufp, self->size), 64);
printf("\n");
self->bufp = self->size = NULL;
}
bash-3.2# dtrace -qs ./sr.d -p 16988
sendto():
0 1 2 3 4 5 6 7 8 9 a b c d e fabcdef
0: 68 65 6c 6c 6f 00 00 00 00 00 00 00 00 00 00 00 hello...........
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
^C
bash-3.2#
주 데이터 기록 버퍼. 한계에 거의 다가 가지 않는다면 이것은 결과가 압도적이며 대부분 중복 될 수 있다는 자극적 인 결과를 낳습니다. 문자열을 찾고 있다는 것을 알고 있다면 간단히 copyinstr()
을 대신 사용할 수 있습니다. 당신이 내 OS 다음 X 10.6.8보다 더 현대적인 DTrace를 구현 한 경우에는 두 번째 인수는 여전히 바이트 기록하지만 숫자의 수에 엄격한 제한입니다 당신이
tracemem(copyin(self->bufp, self->size), 64, self->size);
를 쓸 수 있습니다 찾을 수 있습니다 으로 표시되며은 선택 사항 인 세 번째 인수로 제한됩니다.
마지막으로, 사용자 - 땅 주소는 시스템 호출에 기록되지만 종료시에만 사용된다는 점에 유의하십시오.필요한 경우 시스템 호출이 데이터를 폴트 할 수있게하는 일반적인 관용구입니다. DTrace는 자체적으로 그렇게하지 않으며 비거주 주소를 추적하라는 메시지가 표시되면 런타임에 오류가 발생합니다.