Как найти, куда возвращается вызов библиотеки? - PullRequest
1 голос
/ 02 сентября 2011

Я анализирую внешнюю библиотеку FORTRAN, которая довольно огромна.В любом случае, вся цель библиотеки - соответствовать значениям параметров для функции, которую я предоставляю.Точка входа - это один вызов метода с параметрами godzillion.

Проблема в том, что иногда вызов возвращается довольно быстро, и значения параметров, которые он выдает, могут также поступать из генератора случайных чисел.Вопрос в том, существует ли какой-либо способ в gdb (или каком-либо другом отладчике) увидеть, где был вызван возврат из метода библиотеки?У меня есть исходники, и я уже скомпилировал их с -g.Кстати, я использую g++ и gfortran для компиляции.Я не могу просматривать источники вручную или выполнять их построчно, поскольку весь код состоит из ~ 10k строк беспорядочного кода.

Одна мысль, которая пришла мне в голову, - пройти исходный коди найти все возможные возвраты и установить точки останова на всех из них.Но есть ли другой способ?

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Запустите gdb, введите help next или help nexti, и вы увидите описание команды next, которая в основном продвигается в вашей программе.

Что вы можете сделать, это установить точку останова в начале функции, а затем оттуда запустить программу шаг за шагом (используя next) и посмотреть, где она выходит из функции.

Если программа огромная, вы можете выполнить двоичный поиск точки возврата. Для этого устанавливается точка останова в начале функции, а затем оттуда, например, next 500. Если вы вышли из функции, вы сделали слишком много шагов, поэтому начните сначала и в следующий раз сделайте меньший шаг, например next 250. Если бы вы все еще были в функции, вы могли бы сделать больше и подвести итоги, чтобы узнать, как далеко вы продвинулись. Поэтому, если вы в другой раз скажете next 500 и у вас не будет работы, вы начнете все сначала, а на этот раз начнете с next 750. Вы поняли идею.

Редактировать 1: использовать step вместо next для входа в функции.

Редактировать 2: Попробуйте посмотреть, работает ли он:

Поставьте разрыв в начале функции и войдите в нее. Затем (в GDB, конечно) введите finish для запуска до завершения функции. Затем (это та часть, в которой я не уверен, что она будет работать правильно), введите reverse-step и вернитесь назад к выполнению, чтобы увидеть, где вышла функция! (Как это круто?!)

0 голосов
/ 02 сентября 2011

Вы добавили флаги -g3 -gdwarf-2?Они могут предоставить дополнительную информацию для отладки.

Затем вы можете перейти к каждой строке программы, но я не знаю, будет ли она работать из коробки для библиотеки

...