2010-08-19 2 views
0

응용 프로그램의 콜 그래프를 생성하고자하는이 작은 프로젝트에서 작업 중입니다. 복잡한 작업을 수행 할 계획이 아니라 재미 있고 경험적입니다. 나는 x64 플랫폼에서 일하고있다.현재 함수 주소 - x64

내가 처음 설정 한 목표는 테스트 응용 프로그램의 각 기능에 소요 된 시간을 측정 할 수있게하는 것입니다. 지금까지 내 전략은 __penter() _ 및 __pexit() _ _ __penter() _를 사용하는 것이 었습니다. 모든 메서드 또는 함수의 시작 부분에서 호출되는 함수이며 역으로 __pexit() _는 마지막에 호출됩니다. 모든 방법 또는 기능.

이 두 함수를 사용하여 각 함수 호출은 물론 각 함수 호출을 기록 할 수 있습니다. 다음은 각 함수의 주소를 호출하는 것입니다. 예를 들어
우리는 (매우 단순화 된) 다음 호출 스택 고려하는 경우 :


main() 
....myFunction() 
........_penter() 

내가 __penter_에서 오전과 나는 호출하는 함수의 주소, 하여 myFunction()를 얻을 싶어요. 비 리프 기능의 경우에는 이미 방법을 찾았으므로 간단히 RtlLookupFunctionEntry을 사용합니다. 그러나 이러한 솔루션은 unwind 데이터를 제공하지 않기 때문에 리프 함수에서 작동하지 않는 것처럼 보입니다. 나는 생각했다

한 가지 주요 ()에, 호출 스택에 하나 개 더 수준을 이동하고 수동으로 CALL 절차를 디코딩하는 것입니다 - 그) (하여 myFunction를 호출하는 명령에 대한 포인터를 받고을 포함하는 것 .

리프 함수의 경우 현재 함수의 주소를 얻는 방법을 알고 있는지 궁금합니다. 나는 현재의 접근 방식이 조금 복잡해 졌다고 느끼고있다.

감사합니다,

클렘

답변

1

나는 당신이 원하는 (대부분의?) 아마 StackWalk64와 함께 당신을 얻을해야 SymGetSymFromAddr64 생각합니다.

+0

네, 효과가있었습니다. – Clem

1

흠, x64 코드, ml64.exe를 사용하지 않는 한 임의로 어셈블리 해킹 할 필요가 없습니다. _ReturnAddress()는 __penter() 함수 호출의 코드 위치를 알려줍니다. 그 후에 명령은 btw. 그게 당신이 발신자를 식별하는 데 도움이 될 것입니다.

+0

+1 정확함. 함수는 겹치지 않으므로 MAP 파일에서 _ReturnAddress()보다 낮은 가장 높은 함수 주소를 찾을 수 있습니다. – MSalters

+0

내가 올바르게 이해하게되면 해결책은 MAP 파일을 읽은 다음 _penter의 반송 주소를 기반으로 기능 주소를 얻는 것입니다. 내가 생각한 해결책은 외부 파일을 읽을 필요가 없다는 것입니다. 아직도, 나는 그것을 줄 것이다. 감사! – Clem

+0

dbghelp API를 사용하십시오. –