Как узнать, существует ли определенная функция и была ли она вызвана - PullRequest
0 голосов
/ 23 февраля 2012

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

Например, у меня есть код с функцией Sum, мне нужна команда или что-нибудь, что сообщит мне, если в коде ассемблера существует «Sum» и он был вызван при выполнении.

Спасибо заранее Лютор

Ответы [ 4 ]

2 голосов
/ 23 февраля 2012

Нет способа узнать, была ли функция уже вызвана или нет, если заставить эту функцию установить некоторую глобальную память где-нибудь, чтобы указать ее первое использование (al la static в C). с точки зрения знания, существует ли это, это также почти невозможно, если функция не имеет записи EAT, и в этом случае вы можете использовать GetProcAddress для получения адреса и проверки, что он не равен нулю.

Однако, если вы хотите сделать это во время «компиляции», вы можете узнать, существует ли функция, попытавшись вызвать ее и позволить ассемблеру или компоновщику выдать вам ошибку, если этого не произойдет.

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

0 голосов
/ 23 февраля 2012

Наконец-то я нашел способ. Gcc-компилятор имеет опцию -S, которая заставляет его делать код на ассемблере, и вы можете увидеть его с помощью grep. Если узнать, была ли она выполнена, то точка останова до сих пор работала хорошо.

Спасибо вам, ребята!

0 голосов
/ 23 февраля 2012

Чтобы выяснить, существует ли подпрограмма с именем "Hello", есть несколько вещей, которые можно попробовать.

Из командной строки * nix ...

В верхней частидерево проекта, выполните "grep -lrw Hello *".Это вернет список файлов, которые содержат слово «Hello».Затем вам просто нужно поискать эти файлы.

В качестве альтернативы, если у вас есть отладочная информация, скомпилированная в ваши библиотеки / объектные файлы, вы можете попробовать «nm | grep Hello», чтобы определить, есть ли подпрограмма с именем «Hello ".

Или, возможно, вы захотите выполнить" objdump -d "и выполнить поиск подпрограммы / метки с именем" Hello "(также предполагается, что информация об отладке включена в образ).

Однако многие IDE имеют встроенные функции поиска.Вы можете использовать это, если используете один из них.

Что касается определения того, была ли вызвана эта подпрограмма, для этого потребуется установить и проверить глобальную переменную во время выполнения.

Надеюсь, это поможет.

0 голосов
/ 23 февраля 2012

Что ж, если вы просто хотите увидеть, существует ли функция в коде, вы можете найти ее в своем редакторе.Если вы найдете это, оно существует.

Что касается проверки, вызывается ли он - это немного сложнее, потому что он может быть вызван косвенно, но вы можете установить точку останова в первой инструкции и отладить код.Если отладчик останавливается, вызывается функция.Если отладчик не останавливается на достигнутом, это не значит, что он никогда не вызывается.

...