成员函数的 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 断点的主要内容,如果未能解决你的问题,请参考以下文章