Текущий адрес функции - x64 - PullRequest
0 голосов
/ 20 августа 2010

Я работаю над этим небольшим проектом, в котором я хотел бы создать граф вызовов приложения - я не собираюсь делать что-то сложное, это в основном для развлечения / опыта.Я работаю на платформе x64.

Первая цель, которую я поставил перед собой, - это измерить время, затрачиваемое на каждую функцию моего тестового приложения.До сих пор моей стратегией было использование __penter () _ и __pexit () _ - __penter () _ - это функция, которая будет вызываться в начале каждого метода или функции и, наоборот, __pexit () _ будет вызываться в концекаждый метод или функция.

С помощью этих двух функций я могу записывать каждый вызов функции, а также время, проведенное в каждой из них.Далее я хотел бы получить адрес каждой вызываемой функции.
Например, если мы рассмотрим следующий стек вызовов (очень упрощенный):


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

Я нахожусь в __penter_ и хочучтобы получить адрес вызывающей функции, myFunction () .Я уже нашел способ сделать это в случае неконечных функций, я просто использую RtlLookupFunctionEntry .Однако это решение, похоже, не работает для конечных функций, поскольку они не предоставляют никаких данных для раскрутки.

Одна вещь, о которой я думал, - это подняться еще на один уровень в стеке вызовов в main.() и декодировать процедуру CALL вручную - для этого потребуется получить указатель на инструкцию, вызывающую myFunction () .

Мне было бы интересно, если бы кто-нибудь из вас знал, какполучить адрес текущей функции в случае конечных функций.У меня такое ощущение, что мой нынешний подход немного сложнее.

Спасибо,

Clem

Ответы [ 2 ]

1 голос
/ 20 августа 2010

Хм, код x64, никаких сборочных хаков в вашем распоряжении нет, если вы не используете ml64.exe.Здесь есть одна внутренняя функция, которая должна помочь, _ReturnAddress () дает вам код местоположения вызова вашей функции __penter ()Инструкция после этого, кстати.Этого должно быть достаточно, чтобы помочь вам идентифицировать абонента.

1 голос
/ 20 августа 2010

Полагаю, SymGetSymFromAddr64, вероятно, вместе с StackWalk64 должны дать вам (большей части?) То, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...