成员函数的 C++ GDB 断点

Posted

技术标签:

【中文标题】成员函数的 C++ GDB 断点【英文标题】:C++ GDB breakpoint for member functions 【发布时间】:2016-06-18 18:47:46 【问题描述】:

在我的 c++ 程序上使用 GDB 时遇到问题。我想为我的类成员函数设置一个断点,但我不确定如何执行此操作的语法。我的程序现在正在运行,我只是想学习使用 GDB。我的问题是我在网上找到的所有信息实际上只涉及一个 main() 文件,没有其他函数或类,如果它们涉及类,它只使用带有 void return 语句的函数。

我有一个二叉搜索树类。我想在我的程序中的一个函数处设置一个断点。 这是我的头文件的部分。

class BST

    BST()
    ...
    private:
    int add((BST * root, BST *src);

我正在远程登录到学校的命令行 linux 服务器。 我可以使用 g++ -g *.cpp 让 GDB 与我的程序一起正常运行(还有其他文件可以正常工作),并且文件保存为 a.out。 我运行 GDB 与

gdb ./a.out

然后我进入了 GDB。我可以使用

获得 void 显示功能的断点
b BST::disp_block()

但是如何使用我尝试过的添加功能来做到这一点

b BST::int add(BST*, BST *)
b int BST::add(BST*, BST *)
b BST::add(BST*, BST *)

我什至尝试使用参数名称

b BST::int add(BST * root, BST * src)
b int BST::add(BST * root, BST * src)
b BST::add(BST * root, BST * src)

我不断收到错误

Function "____" not defined.
Make break point pending on future shared library load? (y or [n])

如何为这样的成员函数设置断点?我假设观察点的格式相同,如果不是,您也可以解释一下。

【问题讨论】:

在没有重载的情况下或者如果您想中断所有重载,b BST::add。不需要争论。请注意,如果您的类在命名空间中,您也需要包含命名空间。 也可以通过 filename:linenumber 在 gdb 中设置断点。如果你的函数在 bst.c 中,在第 25 行,命令是:(gdb) b bst.c:25 【参考方案1】:

正如 Dark Falcon 所说,如果您没有重载,break BST::add 应该可以工作。

您也可以输入:

(gdb) break 'BST::add(<TAB>

(注意单引号)。这应该会提示 GDB 执行制表符补全,并像这样完成该行:

(gdb) break 'BST::add(BST*, BST*)

你可以在哪个点添加终止''并按Enter键添加断点。

我可以为void显示函数获取断点

函数返回类型不是其签名的一部分,并且与正在发生的事情无关

【讨论】:

另一个值得了解的技巧是使用 info func 和正则表达式参数来查找 gdb 认为函数可能被命名的内容。 请注意,符号必须是完全命名空间限定的,然后tab-completion才会起作用。【参考方案2】:

如果为类定义了命名空间,您可能需要指定命名空间。如果它不是标准命名空间std。如果您正在执行正确的二进制文件,则文件名是可选的。您可以通过验证符号是否存在于可执行文件中。 “nm -C”命令,其中 -C 处理 C++ 的名称修改。

所以用一个例子来总结一下:如果命名空间是“mySpace”并且类是“X”,其成员是“Y”,那么断点应该像下面的那样,“(gdb) b mySpace::X ::Y"

【讨论】:

以上是关于成员函数的 C++ GDB 断点的主要内容,如果未能解决你的问题,请参考以下文章

通过指针C++调用成员函数,对象为空?

GDB 断点不会命中模板函数

在向量成员变量中存储线程触发断点

C++ 类成员函数地址

C++函数指针与成员函数指针

从 C++ 的成员函数中获取指向成员函数的指针