Подтвердить что ты не робот

Запретить PLT (таблицу привязки процедуры) точки останова в GDB

В последних версиях GDB установка точки останова при вызове функции библиотеки приводит к нескольким фактическим точкам останова:

  • Звонок в таблицу привязки процедуры (PLT)
  • Фактический вызов функции

Это означает, что когда вызывается функция библиотеки, мы получаем каждый раз два перерыва. В предыдущих версиях GDB было создано только # 2 и, следовательно, вы получили бы только один разрыв.

Итак, вопрос: можно ли создать контрольную точку вызова функции библиотеки без соответствующей точки останова PLT? Я знаю, что вы можете создать регулярную точку останова, а затем явно отключить PLT, но это действительно утомительно.

4b9b3361

Ответ 1

Думаю, я нашел решение этой проблемы. Вы можете использовать

break *address

синтаксис break, но вместо указания шестнадцатеричного адреса вы указываете имя функции (которая оценивает адрес функции). Что-то вроде

break *myfunction

Это устанавливает контрольную точку только для основной функции, а не для версий PLT.

Ответ 2

Yup, это можно сделать.

Чтобы просто разместить точки останова для всех функций, используйте команду:

  • rbreak. *

Таким образом, это место точек останова для всех функций, включая PLT.

Теперь введите:

  1. сохранить точки останова имя_файла

Это сохранит список всех точек останова в файле с именем имя_файла.

  1. Теперь откройте файл в обычном текстовом редакторе, например gedit и удалите все строки PLT, указанные в конце файла. Затем сохраните файл только с необходимыми функциями, на которые вы хотите разместить точки останова.

или

  1. Удалите все имена @plt из имен функций с помощью команды:

sed 's/@plt//g' filename > newfilename

  1. После этого выход gdb (чтобы отключить gdb от бесполезных точек останова PLT, добавленных до) и выполнить gdb снова.

Теперь введите команду:

  1. исходное имя файла

или

  1. source newfilename (если вы использовали команду sed)

В этот момент gdb поставит точки останова только на функции, упомянутые в файле, называемом " имя_файла" или " newfilename" (если используется sed).

Примечание. Чтобы больше фильтровать функции в файле "имя файла" , можно использовать grep также в соответствии с требованиями.:)

Ответ 3

добавьте эти строки в свой ~/.gdbinit файл и вызовите disaplts, чтобы отключить все точки останова @plt:

define disaplts
  python
import gdb
from StringIO import StringIO
lines=gdb.execute("info break", True, True)
for l in StringIO(lines).readlines():
  if "@plt" in l:
    bp=l.split()[0]
    gdb.execute("disa {0}".format(bp))
    print("disabling {0}".format(bp))
  end
end

Примечание. Учитывайте интервал в коде python. Я рекомендую вам использовать cat для вставки содержимого.