【问题标题】:breakpoint at end of a function函数末尾的断点
【发布时间】:2020-04-27 11:07:39
【问题描述】:

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

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

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

非常感谢任何帮助。 提前非常感谢!

【问题讨论】:

标签: c++ gdb breakpoints


【解决方案1】:

我已经对此进行了调查,但找不到使用普通 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

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

欢迎使用补丁。

【讨论】:

  • 如果函数没有明确的返回语句,它是否工作?就像函数的引用类型传递 - 像 void (int input, int &output) { output = input } ?
  • 如果函数中没有“return”这个词,这将不起作用。我相信它可以改进。
猜你喜欢
  • 2015-07-08
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多