응용 프로그램의 콜 그래프를 생성하고자하는이 작은 프로젝트에서 작업 중입니다. 복잡한 작업을 수행 할 계획이 아니라 재미 있고 경험적입니다. 나는 x64 플랫폼에서 일하고있다.현재 함수 주소 - x64
내가 처음 설정 한 목표는 테스트 응용 프로그램의 각 기능에 소요 된 시간을 측정 할 수있게하는 것입니다. 지금까지 내 전략은 __penter() _ 및 __pexit() _ _ __penter() _를 사용하는 것이 었습니다. 모든 메서드 또는 함수의 시작 부분에서 호출되는 함수이며 역으로 __pexit() _는 마지막에 호출됩니다. 모든 방법 또는 기능.
이 두 함수를 사용하여 각 함수 호출은 물론 각 함수 호출을 기록 할 수 있습니다. 다음은 각 함수의 주소를 호출하는 것입니다. 예를 들어
우리는 (매우 단순화 된) 다음 호출 스택 고려하는 경우 :
main()
....myFunction()
........_penter()
내가 __penter_에서 오전과 나는 호출하는 함수의 주소, 하여 myFunction()를 얻을 싶어요. 비 리프 기능의 경우에는 이미 방법을 찾았으므로 간단히 RtlLookupFunctionEntry을 사용합니다. 그러나 이러한 솔루션은 unwind 데이터를 제공하지 않기 때문에 리프 함수에서 작동하지 않는 것처럼 보입니다. 나는 생각했다
한 가지 주요 ()에, 호출 스택에 하나 개 더 수준을 이동하고 수동으로 CALL 절차를 디코딩하는 것입니다 - 그) (하여 myFunction를 호출하는 명령에 대한 포인터를 받고을 포함하는 것 .
리프 함수의 경우 현재 함수의 주소를 얻는 방법을 알고 있는지 궁금합니다. 나는 현재의 접근 방식이 조금 복잡해 졌다고 느끼고있다.
감사합니다,
클렘
네, 효과가있었습니다. – Clem