2016-11-22 14 views
2

예를 들어 TextEdit Application을 사용하는 경우 파일을 저장할 때 어떤 objective-c 메소드가 호출되는지 알고 싶습니다. Classed-dump를 사용하여 Textedit의 헤더 파일을 가지고 있습니다.Mac에서 모든 응용 프로그램의 런타임에 objective-c 메서드를 찾는 방법은 무엇입니까?

(클래스 덤프에서 출력하는) 이러한 메소드 중 어떤 것이 런타임에 호출되는지 알 수있는 방법이 있습니까?

dtrace와 함께 할 수있는 방법은 무엇입니까 ??

답변

0

목표 - 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       
... 
+0

감사합니다. 하지만 더 필요합니다. TextEdit의 클래스 덤프가 있습니다. 그 안에 - (BOOL) validateMenuItem : (id) arg1; 문서 클래스의 실행 여부가 결정됩니다. 그래서 스크립트를 사용하여 dtrace -s userfunc.d 1102 * validateMenuItem *으로 실행했습니다. 프로브 설명이 일치하지 않는다고합니다. 무엇을해야합니까 ?? –

+0

@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 {}'는 프로세스에서 * 모든 * 함수 호출을 내 보낸다. 나는 지금 그것을 시험 할 수 없다. –

+0

아마도 맞을 것입니다. 기능이 엉망입니다. 리버스 엔지니어링이나 시행 착오를 통해 지금 수행 할 수있는 유일한 방법이 있습니다. 나는 사람들이 어떻게 혼란스러워하는지 궁금해. 리버스 엔지니어링은 아마 swizzling을하는 정확한 기능을 찾기 위해 며칠이 걸릴 것입니다. –