我有一个大型源代码树,其中包含一个目录,其中包含多个文件。我希望gdb在每次调用这些函数时都会中断,但不希望必须指定每个文件。我已尝试设置break /path/to/dir/:*
,break /path/to/dir/*:*
,rbreak /path/to/dir/.*:*
,但它们都没有捕获该目录中的任何功能。我怎样才能让gdb做我想做的事?
答案 0 :(得分:1)
似乎没有直接的方法来做到这一点:
rbreak file:.
似乎不接受目录,只接受文件。另请注意,您需要一个点.
,而不是星号*
我发现最好的解决方法是使用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/)