2013-05-23 1 views
0

인텔 핀을 사용하여 프로파일 러를 쓰고 있습니다. 도구 프로파일은 각 루틴의 전후에 계측 코드를 추가하여 실행 파일에서 기능합니다. 각 루틴의 경우, I는 BeforeCall 및 AfterCall이Intel Pin : RTN 수준 분석에서 '스레드 ID 인수가 항상 0입니까?

VOID BeforeCall(unsigned int funcID,THREADID threadID); 
VOID AfterCall(unsigned int funcID,THREADID threadID); 

같이

RTN_InsertCall(routine, IPOINT_BEFORE, (AFUNPTR)BeforeCall, 
    IARG_UINT32, RTN_Id(routine), 
    IARG_THREAD_ID, 
    IARG_END); 

RTN_InsertCall(routine, IPOINT_AFTER, (AFUNPTR)AfterCall, 
    IARG_UINT32, RTN_Id(routine), 
    IARG_THREAD_ID, 
    IARG_END); 

아래로 핀에 콜백을 추가하는 항상 이러한 콜백에 변수 '을 threadID'제로의 값을가집니다. 계측중인 응용 프로그램에는 개의 스레드가 있습니다. 실행 중입니다. Pin과 함께 제공되는 예제는 스레드 ID에 액세스하는 동일한 방법을 사용합니다. 이 구현이 맞습니까? 그렇지 않다면, 루틴이 실행되고있는 스레드의 실제 스레드 ID를 어떻게 잡아낼 수 있습니까?

답변

0

인텔 설명서를 보면 멀티 스레드 프로그램을 설치하는 데 필요한 것이 무엇인지 알 수 있습니다. threadid를 검색하는 방법은 여러 가지가 있습니다. 하나는 나를 위해 작동하는 것입니다.

PIN_GetThreadID() 

분석 루틴에 있습니다. 그러나 그 논쟁을 사용하는 것이 더 최적 인 경우가 있습니다. 매뉴얼을 사용하려고하는지 모르겠다면, here이미지 기반 계측을 사용하여 RTN 레벨의 호출을 호출하는 멀티 스레드 대상의 좋은 예입니다. 대조적으로, 나는 당신의 것이 정확히 무엇인지 모른다.

또한이 방법을 사용하는 인텔 배송의 예가 나와 있지만 결과와 인텔의 pintool 사이의 대비에 대해서는 많이 언급하지 않았습니다. 타겟에 맞춰 도구를 실행하여 작동하는지 확인하고 결과를 게시하십시오. 또한 코드가 작동하면 도구를 수정하여 코드를 통합하는 경로는 무엇입니까?

또한 pintool을 괴롭히는 미묘한 오류가 있습니다. 수동으로 모든 것을 읽지 않았기 때문에 주어진 통화에서 모든 수익을 얻을 수 있다고 믿는 RTN 레벨 계측을 사용하고있는 것으로 보입니다. 이 상황에서 알아야 할 점은 컴파일러가 많은 최적화 작업을 수행한다는 것과 모든 호출을 캡처 할 수 있다고 보장 할 수는 있지만 함수가 여러 번 반환 할 수 있기 때문에 모든 수익률을 보장하는 것이 보장되지 않는다는 것입니다. 이를 위해서는 Trace based instrumentation (매뉴얼에 설명되어 있음)을 사용해야합니다.

이 질문에 대한 답변을 찾을 수 없다면 귀하의 소스를 게시하는 것이 더 적절하다고 생각합니다. 다행히도, 내가 당장 사용할 수있는 github repo를 설정하는 것이 좋습니다. 구성 할 수있는 작은 노력만으로도 작고 재현 할 수 있습니다. 그것을 위해 폴더 메이크 파일 밖을 사용하는 것이 좋습니다.