목표 - C의 방법은 사용자 공간 함수 호출로 직접 번역 가정 할 때, 당신은 사용할 수 있어야합니다 the DTrace pid provider :
pid
바이더 pid
제공 당신은 어떤을 추적 할 수 있습니다
명령 과정. 대부분의 다른 제공 업체와 달리 pid
프로브는 D 프로그램에있는 프로브 설명을 기준으로 요청에 생성됩니다. pid
공급자
작업의 간단한 모드를 추적
사용자 함수 경계는 fbt
공급자 사용자 공간 아날로그 같습니다. 다음 예제 프로그램 은 하나의 함수에서 만들어진 모든 함수 항목과 반환 값을 추적합니다. $1
매크로 변수는 명령 줄의 첫 번째 피연산자로 확장됩니다. 이 매크로 변수는 추적 프로세스의 프로세스 ID입니다. $2
매크로 변수는 명령 줄의 두 번째 피연산자로 확장됩니다. 이 매크로 변수는 모든 함수 호출이 추적되는 함수의 이름입니다.
예 4-3 userfunc.d
: 트레이스 사용 기능 항목 및이 스크립트는 다음 예제와 비슷한 출력 생산
pid$1::$2:entry
{
self->trace = 1;
}
pid$1::$2:return
/self->trace/
{
self->trace = 0;
}
pid$1:::entry,
pid$1:::return
/self->trace/
{
}
돌아 가기 : 귀하의 정보를
# ./userfunc.d 15032 execute
dtrace: script './userfunc.d' matched 11594 probes
0 -> execute
0 -> execute
0 -> Dfix
0 <- Dfix
0 -> s_strsave
0 -> malloc
0 <- malloc
0 <- s_strsave
0 -> set
0 -> malloc
0 <- malloc
0 <- set
0 -> set1
0 -> tglob
0 <- tglob
0 <- set1
0 -> setq
0 -> s_strcmp
0 <- s_strcmp
...
감사합니다. 하지만 더 필요합니다. TextEdit의 클래스 덤프가 있습니다. 그 안에 - (BOOL) validateMenuItem : (id) arg1; 문서 클래스의 실행 여부가 결정됩니다. 그래서 스크립트를 사용하여 dtrace -s userfunc.d 1102 * validateMenuItem *으로 실행했습니다. 프로브 설명이 일치하지 않는다고합니다. 무엇을해야합니까 ?? –
@hrishikeshchaudhari 함수 이름이 정확히'validateMenuItem'이 아닐 수도 있습니다. 그것은 아마도 엉망이 될 것입니다 (https://en.wikipedia.org/wiki/Name_mangling). 필자는 바이너리에서 실제로 맹 글링 된 함수 이름을 찾을 수있는 유틸리티를 말하는 OS X에 익숙하지 않습니다. 'strings -a/bin/file | grep -i validateMenuItem' *가 작동 할 수도 있습니다. 이것은 도움이 될 수 있습니다 : http://stackoverflow.com/questions/4506121/how-to-print-a-list-of-symbols-exported-from-a-dynamic-library DTrace 스크립트를'pid $ 1 : :: entry {}'는 프로세스에서 * 모든 * 함수 호출을 내 보낸다. 나는 지금 그것을 시험 할 수 없다. –
아마도 맞을 것입니다. 기능이 엉망입니다. 리버스 엔지니어링이나 시행 착오를 통해 지금 수행 할 수있는 유일한 방법이 있습니다. 나는 사람들이 어떻게 혼란스러워하는지 궁금해. 리버스 엔지니어링은 아마 swizzling을하는 정확한 기능을 찾기 위해 며칠이 걸릴 것입니다. –