函数末尾的断点

Cut*_*son 5 c++ gdb breakpoints

我正在尝试通过 gdb 脚本记录函数的输入和输出。下面是一个示例脚本。

set logging on
b func2
commands
silent
bt 1
continue
end
b func1
commands
silent
bt 1
set logging off
continue
end
Run Code Online (Sandbox Code Playgroud)

它工作正常并在指定的函数处断点,打印回溯并继续。有没有办法在被调用函数返回调用函数之前自动设置断点,这样我就可以在这个“新”断点之后通过 gdb 打印输出变量。这将大大简化我的调试,并有助于理解代码中不同调用的函数行为。

任何帮助都受到高度赞赏。非常感谢!

jbc*_*coe 3

我对此进行了研究,但找不到使用普通 GDB 断点来执行此操作的方法。

可以使用 GDB Python 扩展 API 来实现。

source使用 GDB 编辑一个包含以下内容 ( source FILENAME) 的文件将允许发出命令,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
Run Code Online (Sandbox Code Playgroud)

取自https://github.com/jbcoe/GDB-extensions/blob/master/extensions/break-return.py

欢迎补丁。