2016-03-04 609 views
7

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

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

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

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

gdb ./a.out 

我进入GDB。我可以得到虚空显示功能只是

b BST::disp_block() 

细破发点,但我怎么用add函数我试图

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]) 

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

+2

在没有重载的情况下,或者如果你想在所有的重载中断开,'b BST :: add'。不需要论证。请注意,如果您的类位于命名空间中,则还需要包含命名空间。 –

+1

也可以通过文件名:linenumber在gdb中设置断点。如果你的函数在bst.c中,在第25行,命令是: (gdb)bst.c:25 – JGroven

回答

6

正如黑暗猎鹰所言,break BST::add应该工作,如果你没有超载。

您也可以键入:

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

(注意单引号)。这应该促使GDB进行制表完成,并完成第一行:

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

和点你可以添加终止'“,然后按Enter键添加断点。

我可以得到虚空显示功能

函数的返回类型不是其签名的组成部分,具有没有做什么发生一个破发点。

+3

另一个值得了解的技巧是使用'info func'和regexp参数来找到gdb认为a函数可能会被命名。 –

2

您可能需要指定名称空间(如果为该类定义的话)。如果它不是标准命名空间标准。如果您正在执行正确的二进制文件,则文件名是可选的。您可以验证可执行文件中是否存在符号。 “nm -C”命令,其中-C处理C++的名称修改。如果命名空间是“mySpace”,并且类是“X”,其成员是“Y”,那么断点应如下所示:“(gdb)b mySpace :: X :: Y“