【问题标题】:C++ GDB breakpoint for member functions成员函数的 C++ GDB 断点
【发布时间】: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

标签: c++ gdb breakpoints member-functions


【解决方案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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2018-10-09
    • 2016-07-17
    相关资源
    最近更新 更多