gdb Python 编程:如何为 C++ 类的每个方法设置断点?

4 投票
3 回答
612 浏览
提问于 2025-04-16 19:06

我想在gdb中为C++类的每个方法设置断点。我觉得用Python来做这个可能是最简单的,因为现在Python可以完全访问gdb。不过我对Python了解得不多,加上gdb,更是难上加难。我想知道有没有人知道怎么写一个Python类的代码,能够在gdb中为指定类的每个方法设置断点。

3 个回答

0

你可以用Python生成一个.gdbrc文件,这个文件里每一行都包含'break C::foo',其中的'foo'是你类C里的每一个函数的名字。然后你就可以启动gdb调试工具了。

1

编辑:我刚注意到你是在问如何用C++类来做这个,而不是用Python。哎呀。为了希望能帮助到任何调试Python扩展的人,我还是把这个答案保留在这里...


稍微搜索一下就能发现:Python代码可以通过gdb.Breakpoint类来操作断点。

我们可以这样找到一个类的所有方法:

import inspect
class Foo(object):
    bar = 1
    def baz(self):
        print "quoz"
inspect.getmembers(Foo, inspect.ismethod)
# [('baz', <unbound method Foo.baz>)] 

把这些结合起来:

def stop_hammertime(klass):
    methods = inspect.getmembers(klass, inspect.ismethod)
    method_names = [klass.__name__ + m[0] for m in methods]
    return [gdb.Breakpoint(m) for m in method_names]

注意:这个代码没有经过测试,因为我没有安装gdb模块。

3

假设你在编译的时候加上了调试符号,其实你甚至不需要用到python:

rbreak source.cpp:.

撰写回答