在文件中的类的成员函数上设置断点

时间:2011-09-07 10:21:44

标签: gdb breakpoints

(gdb) b breakpoints.cpp:X::X()

Can't find member of namespace, class, struct, or union named "breakpoints.cpp:X::X"
Hint: try 'breakpoints.cpp:X::X()<TAB> or 'breakpoints.cpp:X::X()<ESC-?>
(Note leading single quote.)
Make breakpoint pending on future shared library load? (y or [n]) n

以下代码:

#include <stdio.h>
#include <iostream>

class X
{
    public:
        X   () 
        {
            std :: cout << "\nIn the default constructor";
        }

        X   (int) 
        {
            std :: cout << "\nIn the parameterized constructor";
        }

        ~X () {}
};

int main (int argc, char *argv[])
{
    X xObjA;
    X xObjB (11);

    while (--argc > 0)
    {
        printf("\n%s ", argv [argc]);
    }
    std :: cout << std :: endl << std :: endl;
}

文件名是:breakpoints.cpp

我错过了什么意思?

3 个答案:

答案 0 :(得分:3)

这是设置断点的正确方法。

你要么在错误的可执行文件上尝试(在目录中放置breakspoints.cpp并使用g ++ -g breakpoints.cpp进行编译,然后在a.out可执行文件上使用gdb),代码与发布的不同,也许有名称空间,或者由于使用了过时的gdb版本,你偶然发现了一个旧的错误。

答案 1 :(得分:1)

也许您需要在没有文件名的情况下定义断点。以下适用于我:

break FooNamespace::FooClass::doSomething()

我想这只适用于类是唯一的,所以它应该在命名空间中。

注意

如果有多个地方可以放置断点,我认为 gdb 会尝试在所有地方放置断点,所以你最终会得到一些东西喜欢以下内容:

Breakpoint 1 at 0x7fe62f8e744d: file src/FooClass.cpp, line 42. (2 locations)
(gdb) info break
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   <MULTIPLE>
1.1                         y   0x00007fe62f8e744d in FooNamespace::FooClass::doSomething() at src/FooClass.cpp:42
1.2                         y   0x00007fe62f8e7c5d in FooNamespace::FooClass::doSomething() at src/FooClass.cpp:42

答案 2 :(得分:0)

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

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