установка точки останова в определенной строке внутри функции с помощью 'gdb'

Я пытаюсь установить точку останова на пятую строку внутри функции-члена класса (класс, который я создал) с помощью "gdb".

Отсюда я понял, как установить точку останова в начале функции, но я хочу установить ее на определенной строке внутри функции или конкретном смещении от начала этой функции.

В общем, есть ли способ "gdb" установить точку останова на строку, установив смещение от другой точки останова, которую у меня уже есть?

Благодаря !

Ответ 1

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

Его можно было бы эмулировать из Python, хотя он не мог работать точно так, как работают обычные точки останова, поскольку Python не имеет доступа к механизму сброса точки останова внутри gdb.

Решение с одним выстрелом может быть выполнено либо в другом ответе, либо в Python.

Когда мне нужна такая функциональность - промежуточная функция точки останова, которая достаточно устойчива к изменениям источника, я использовал статические точки зонда "SDT". Они позволяют вам называть такие места в вашем источнике.

Ответ 2

Вы можете создать точку останова при смещении от текущей остановленной позиции с gdb breakpoint +<offset>.

Вы также можете создать точку останова на определенном номере линии, используя либо gdb break <linenumber> (для текущего исходного файла), либо gdb break <filename>:<linenumber> (для файла, отличного от текущего файла).

Подробнее в документах.

Ответ 3

  1. info fun <function name> или полнофункциональные info functions <function name> получает функции и их исходные файлы
  2. list <function name>

Печатные линии центрированы вокруг начала функциональной функции.

Перечислит весь исходный код функции, с некоторым кодом ниже.

  1. Выберите нужную строку
  2. 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