установка точки останова в определенной строке внутри функции с помощью 'gdb'
Я пытаюсь установить точку останова на пятую строку внутри функции-члена класса (класс, который я создал) с помощью "gdb".
Отсюда я понял, как установить точку останова в начале функции, но я хочу установить ее на определенной строке внутри функции или конкретном смещении от начала этой функции.
В общем, есть ли способ "gdb" установить точку останова на строку, установив смещение от другой точки останова, которую у меня уже есть?
Благодаря !
Ответы
Ответ 1
Не существует способа установить точку останова относительно начала функции, чтобы сохранить ее относительное положение, если исходный файл изменен. Иногда это было бы полезно; но это просто функция, которую никто не добавил в gdb.
Его можно было бы эмулировать из Python, хотя он не мог работать точно так, как работают обычные точки останова, поскольку Python не имеет доступа к механизму сброса точки останова внутри gdb.
Решение с одним выстрелом может быть выполнено либо в другом ответе, либо в Python.
Когда мне нужна такая функциональность - промежуточная функция точки останова, которая достаточно устойчива к изменениям источника, я использовал статические точки зонда "SDT". Они позволяют вам называть такие места в вашем источнике.
Ответ 2
Вы можете создать точку останова при смещении от текущей остановленной позиции с gdb breakpoint +<offset>
.
Вы также можете создать точку останова на определенном номере линии, используя либо gdb break <linenumber>
(для текущего исходного файла), либо gdb break <filename>:<linenumber>
(для файла, отличного от текущего файла).
Подробнее в документах.
Ответ 3
-
info fun <function name>
или полнофункциональные info functions <function name>
получает функции и их исходные файлы -
list <function name>
Печатные линии центрированы вокруг начала функциональной функции.
Перечислит весь исходный код функции, с некоторым кодом ниже.
- Выберите нужную строку
-
break <filename:linenum>
Ответ 4
Здесь вы можете автоматизировать его с помощью скриптов python для GDB:
class RelativeFunctionBreakpoint (gdb.Breakpoint):
def __init__(self, functionName, lineOffset):
super().__init__(RelativeFunctionBreakpoint.calculate(functionName, lineOffset))
def calculate(functionName, lineOffset):
"""
Calculates an absolute breakpoint location (file:linenumber)
based on functionName and lineOffset
"""
# get info about the file and line number where the function is defined
info = gdb.execute("info line "+functionName, to_string=True)
# extract file name and line number
m = re.match(r'Line[^\d]+(\d+)[^"]+"([^"]+)', info)
if not m:
raise Exception('Failed to find function %s.' % functionName)
line = int(m.group(1))+lineOffset #add the lineOffset
fileName = m.group(2)
return "%s:%d" % (fileName, line)
Основное использование:
RelativeFunctionBreakpoint("yourFunctionName", lineOffset=5)
Вы также можете написать пользовательскую точку останова. Подробнее см. Здесь: fooobar.com/info/1197947/...
Использование python для скрипта GDB