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 打印输出变量。这将大大简化我的调试,并有助于理解代码中不同调用的函数行为。
任何帮助都受到高度赞赏。非常感谢!
我对此进行了研究,但找不到使用普通 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
欢迎补丁。
| 归档时间: |
|
| 查看次数: |
246 次 |
| 最近记录: |