使用'gdb'在函数内的特定行中设置断点

时间:2015-12-09 22:56:24

标签: c++ gdb

我试图使用'gdb'将断点设置到类(我创建的类)的成员函数内的第五行。

here我理解如何在函数的开始处设置断点,但我想在特定的行内设置它从该函数开始的函数或特定的偏移

一般情况下,'gdb'中有一种方法可以通过设置我已经拥有的另一个断点的偏移量来设置断点吗?

谢谢!

4 个答案:

答案 0 :(得分:12)

您可以使用gdb breakpoint +<offset>在与当前停止位置的偏移量处创建断点。

您还可以使用gdb break <linenumber>(对于当前源文件)或gdb break <filename>:<linenumber>(对于当前文件以外的文件)在特定行号上创建断点。

docs

中的更多详细信息

答案 1 :(得分:2)

没有办法相对于函数的开头设置断点,以便在修改源文件时它将保持其相对位置。这有时会很有用;但它只是没有人添加到gdb的功能。

它可以用Python模拟,虽然它不能像普通断点一样工作,因为Python无法访问gdb中的断点重置机制。

可以按照其他答案或Python中的说明完成一次性解决方案。

当我需要这种功能时 - 断点中间功能对于源更改相当强大 - 我已经使用过&#34; SDT&#34;静态探针点。这些允许您在源中命名这些位置。

答案 2 :(得分:1)

  1. info fun <function name> 或完全合格的info functions <function name> 获取函数及其源文件
  2. list <function name>
  3.   

    以功能开头为中心打印行。

    将列出所有功能的源代码,下面是一些代码。

    1. 选择您想要的行
    2. break <filename:linenum>

答案 3 :(得分:1)

以下是如何使用GDB的python脚本自动化它:

whitevalues = sum([1 for r in pix for c in r if c == 1])

基本用法:

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)

您还可以编写自定义断点。在这里查看更多: https://stackoverflow.com/a/46737659/5787022

使用python脚本编写GDB