成员函数的 C++ GDB 断点

C++ GDB breakpoint for member functions

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

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

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

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

gdb ./a.out

我进入了 GDB。我可以通过

获得无效显示功能的断点
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])

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

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

您还可以输入:

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

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

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

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

I can get a break point for the void display function

函数 return 类型不是其签名的一部分,与正在发生的事情没有任何关系

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

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