2011-10-20 3 views
3

프로브 SystemTap 프로브를 사용하는 오버로드 된 메소드를 어떻게 구별 할 수 있습니까?SystemTap을 사용하여 오버로드 된 C++ 메소드

예. .stp 파일에서

class A { 
// ... 
void doFoo(); 
void doFoo(int a); 
// ... 
}; 

:

probe process("foobar").function("A::doFoo<NO ARGS>").return { 
    // do something 
} 
probe process("foobar").function("A::doFoo<USING INT>").return { 
    // do something different 
} 

.statement(@file:line)를 사용하여 가치가 없습니다 그래서 두 가지 방법이 충분히 여러 반환 지점이있을 수 있습니다 것이 좋습니다.

+0

맹 글링 된 함수 이름으로 시도해 보셨습니까? – crazyjul

+0

'ldd'에 의해 반환 된 맹 글링 된 이름으로 아무런 영향을 미치지 않으려 고 시도했습니다. 그러나 각 컴파일러는 맹 글링 추론에 대해 자유 롭기 때문에 이벤트는 이식 가능하지 않습니다. – milton

답변

5

stap 1.4 이후로, debuginfo에서 설명한대로 맹 글링 된 이름을 조사해야합니다. 당신의 예제로 테스트 프로그램을 만들었고, "_ZN1A5doFooEv"와 "_ZN1A5doFooEi"가 각각 void와 int의 경우에 사용되었습니다. 그것은 올바른 MIPS_linkage_name 작성하는 컴파일러에 따라 다릅니다. 때로는 심볼 테이블에서도 작동 할 수 있지만 컴파일러가 생성 한 함수의 최적화 된 버전을 모두 포함하지는 않습니다.

검색된 모든 변경된 이름을 보려면 stap -l 'process("foobar").function("_Z*")'을 시도하십시오. 와일드 카드에서 _Z은 맹 글링 된 이름 처리를 트리거하는 데 필요합니다.

stap이 프로브 포인트를 찾는 중이지만 예상대로 실행되지 않는 것 같으면 컴파일러에서 여러 버전의 함수를 인라인으로 표시하고 표시하지 않을 수 있습니다. 시도가 발견되는 .call, .inline 및 .return의 변형을 보려면 stap -l 'process("foobar").function("_Z*").*'을 시도하십시오. .return 프로브는 인라인에서 작동하지 않으므로 .call 인스턴스에만 해당합니다.

@file : line 구문은 또한 라인이 포함 된 함수를 찾기 위해 작동하므로,이를 사용하여 .statement 프로브뿐만 아니라 function.return 양식도 앵커링 할 수 있습니다. 이 경우 모든 반환 지점에 대해 걱정할 필요가 없습니다. 관심있는 기능의 모든 라인을 선택하면 모든 반환 지침이 트랩됩니다. (이것은 당신이 인라인을 다루지 않는다고 가정합니다.)

관련 문제