Запретить PLT (таблицу привязки процедуры) точки останова в GDB
В последних версиях GDB установка точки останова при вызове функции библиотеки приводит к нескольким фактическим точкам останова:
- Звонок в таблицу привязки процедуры (PLT)
- Фактический вызов функции
Это означает, что когда вызывается функция библиотеки, мы получаем каждый раз два перерыва. В предыдущих версиях GDB было создано только # 2 и, следовательно, вы получили бы только один разрыв.
Итак, вопрос: можно ли создать контрольную точку вызова функции библиотеки без соответствующей точки останова PLT? Я знаю, что вы можете создать регулярную точку останова, а затем явно отключить PLT, но это действительно утомительно.
Ответы
Ответ 1
Думаю, я нашел решение этой проблемы. Вы можете использовать
break *address
синтаксис break, но вместо указания шестнадцатеричного адреса вы указываете имя функции (которая оценивает адрес функции). Что-то вроде
break *myfunction
Это устанавливает контрольную точку только для основной функции, а не для версий PLT.
Ответ 2
Yup, это можно сделать.
Чтобы просто разместить точки останова для всех функций, используйте команду:
Таким образом, это место точек останова для всех функций, включая PLT.
Теперь введите:
- сохранить точки останова имя_файла
Это сохранит список всех точек останова в файле с именем имя_файла.
- Теперь откройте файл в обычном текстовом редакторе, например gedit и удалите все строки PLT, указанные в конце файла. Затем сохраните файл только с необходимыми функциями, на которые вы хотите разместить точки останова.
или
- Удалите все имена @plt из имен функций с помощью команды:
sed 's/@plt//g' filename > newfilename
- После этого выход gdb (чтобы отключить gdb от бесполезных точек останова PLT, добавленных до) и выполнить gdb снова.
Теперь введите команду:
- исходное имя файла
или
- 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
для вставки содержимого.