точка останова в конце функции - PullRequest
4 голосов
/ 27 апреля 2020

Я пытаюсь зарегистрировать ввод и вывод функции через скрипт gdb. ниже приведен пример сценария.

set logging on
b func2
commands
silent
bt 1
continue
end
b func1
commands
silent
bt 1
set logging off
continue
end

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

Любая помощь очень ценится. Большое спасибо заранее!

1 Ответ

3 голосов
/ 27 апреля 2020

Я изучил это и не могу найти способ сделать это с обычными точками останова GDB.

Возможно реализовать с помощью API расширений GDB Python.

source -ing файл со следующим содержимым (source FILENAME) из GDB позволит выполнить команду break-return, которая будет ставить временную точку останова при каждом «возврате» в текущий файл (это излишне, но работает). Как только одна из точек останова достигнута, все они удаляются.

import gdb

class _ReturnBreakpoint(gdb.Breakpoint):
    def stop(self):
        for breakpoint in self._siblings:
            if breakpoint.number != self.number:
                gdb.execute(f"d {breakpoint.number}")
        return True    

class _BreakReturn(gdb.Command):
    def __init__(self):
        super(_BreakReturn, self).__init__("break-return", gdb.COMMAND_USER)

    def invoke(self, arg, from_tty):
        function_name = gdb.selected_frame().name()
        source_file = gdb.selected_frame().find_sal().symtab.filename

        breakpoints = []
        with open(source_file) as o:
            for zero_based_index, line in enumerate(o.readlines()):
                if not 'return ' in line:
                    continue
                breakpoint = _ReturnBreakpoint(line=zero_based_index+1, temporary=True)
                breakpoints.append(breakpoint)

        for breakpoint in breakpoints:
            breakpoint._siblings = breakpoints

_BreakReturn()  # register the command with GDB

Взято из https://github.com/jbcoe/GDB-extensions/blob/master/extensions/break-return.py

Патчи приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...