【发布时间】:2017-10-28 01:05:31
【问题描述】:
我正在尝试使用“gdb”在类(我创建的类)的成员函数内的第五行设置断点。
来自here 我了解如何在函数的开始处设置断点,但我想在函数内的特定行上设置断点,或从该函数开始的特定偏移量。
一般来说,'gdb' 中是否有办法通过设置与我已有的另一个断点的偏移量来为行设置断点?
谢谢!
【问题讨论】:
我正在尝试使用“gdb”在类(我创建的类)的成员函数内的第五行设置断点。
来自here 我了解如何在函数的开始处设置断点,但我想在函数内的特定行上设置断点,或从该函数开始的特定偏移量。
一般来说,'gdb' 中是否有办法通过设置与我已有的另一个断点的偏移量来为行设置断点?
谢谢!
【问题讨论】:
您可以使用gdb breakpoint +<offset> 在当前停止位置的偏移处创建断点。
您还可以使用gdb break <linenumber>(针对当前源文件)或gdb break <filename>:<linenumber>(针对当前文件以外的文件)在特定行号上创建断点。
更多详情请关注docs。
【讨论】:
没有办法设置相对于函数开头的断点,以便在修改源文件时保留其相对位置。这有时会很有用;但它只是一个没有人添加到 gdb 的功能。
它可以从 Python 中模拟出来,虽然它不能完全按照普通断点的工作方式工作,因为 Python 无法访问 gdb 中的断点重置机制。
可以按照其他答案中所示或通过 Python 完成一次性解决方案。
当我需要这种功能时——一个对源代码更改相当健壮的断点中间功能——我使用了“SDT”静态探测点。这些可让您在源中命名此类位置。
【讨论】:
info fun <function name>
或完全合格的info functions <function name>
获取函数及其源文件list <function name>打印以函数开头为中心的行。
将列出所有函数的源代码,部分代码如下。
break <filename:linenum>【讨论】:
以下是使用 GDB 的 python 脚本自动化它的方法:
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)
您还可以编写自定义断点。在这里查看更多: https://stackoverflow.com/a/46737659/5787022
使用python编写GDB脚本
【讨论】: