gdb可以在目录中的每个函数中设置中断吗?

时间:2015-04-03 17:43:34

标签: debugging gdb breakpoints

我有一个大型源代码树,其中包含一个目录,其中包含多个文件。我希望gdb在每次调用这些函数时都会中断,但不希望必须指定每个文件。我已尝试设置break /path/to/dir/:*break /path/to/dir/*:*rbreak /path/to/dir/.*:*,但它们都没有捕获该目录中的任何功能。我怎样才能让gdb做我想做的事?

2 个答案:

答案 0 :(得分:1)

似乎没有直接的方法来做到这一点:

  • rbreak file:.似乎不接受目录,只接受文件。另请注意,您需要一个点.,而不是星号*
  • 似乎没有办法在Python API中循环遍历符号,请参阅https://stackoverflow.com/a/30032690/895245

我发现最好的解决方法是使用Python API循环遍历文件,然后使用这些文件调用rbreak

import os

class RbreakDir(gdb.Command):
    def __init__(self):
        super().__init__(
            'rbreak-dir',
            gdb.COMMAND_BREAKPOINTS,
            gdb.COMPLETE_NONE,
            False
        )
    def invoke(self, arg, from_tty):
        for root, dirs, files in os.walk(arg):
            for basename in files:
                path = os.path.abspath(os.path.join(root, basename))
                gdb.execute('rbreak {}:.'.format(path), to_string=True)
RbreakDir()

样本用法:

source a.py
rbreak-dir directory

由于gdb.execute调用,这很难看,但似乎有效。

如果你在目录下有很多的文件,那就太慢了。

我的测试代码位于my GitHub repo

答案 1 :(得分:0)

您可以使用现代gdb附带的Python脚本来完成此操作。两个选项:一个是列出所有符号,然后如果它们包含所需的目录,则在适当的位置创建一个Breakpoint类的实例来设置断点。 (对不起,我不记得如何得到所有符号的列表,但我认为你可以这样做。)

你还没有说明为什么你需要这样做,但根据你的用例,另一种选择可能是使用可逆调试 - 即让它崩溃,然后倒退。您可以使用gdb的内置可逆调试,或者从根本上提高性能,请参阅UndoDB(http://undo-software.com/