GDB:警告:在重载方法上设置了多个断点

Aqu*_*irl 5 c++ gdb breakpoints

anisha@linux-dopx:~> g++ -Wall -pedantic breakpoints.cpp -g
anisha@linux-dopx:~> gdb a.out
(gdb) b X::X
Breakpoint 1 at 0x400ac1: file breakpoints.cpp, line 14.
Breakpoint 2 at 0x400aa0: file breakpoints.cpp, line 9.
warning: Multiple breakpoints were set.
Use the "delete" command to delete unwanted breakpoints.
(gdb)
Run Code Online (Sandbox Code Playgroud)

在默认构造函数上设置断点的方法是什么,这样GDB不会在其重载的对应项上创建不必要的断点?

或者它是GDB的问题,它希望用户删除它的混乱?还是我错过了一点?

编辑1.

对于以下代码:

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

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

        ~X () {}
};
Run Code Online (Sandbox Code Playgroud)

我试过了:

(gdb) b X:: X (11)
the class X does not have any method named X (11)
Hint: try 'X:: X (11)<TAB> or 'X:: X (11)<ESC-?>
(Note leading single quote.)
Make breakpoint pending on future shared library load? (y or [n]) 
Run Code Online (Sandbox Code Playgroud)

没帮忙!

编辑2.

感谢osgx,以下作品:

(gdb) b X::X(int)
Breakpoint 5 at 0x400ac1: file breakpoints.cpp, line 14.
(gdb) b X::X()
Breakpoint 6 at 0x400aa0: file breakpoints.cpp, line 9.
(gdb) 
Run Code Online (Sandbox Code Playgroud)

osg*_*sgx 6

我想,这种情况很正常.一些ABI将为Class生成两个构造函数.当你问b X::Xgdb将检测两个构造函数并设置两个断点.(对不起,这不是你的情况)

"设置了多个断点".也可以为重载方法提供警告(这是您的情况):http://www.delorie.com/gnu/docs/gdb/gdb_36.html

某些编程语言(特别是C++)允许多次定义单个函数名称,以便在不同的上下文中应用.这称为重载.当一个函数名重载时,`break函数'不足以告诉GDB你想要一个断点.

对于此类方法,您可以通过键入其类型来选择一种方法:

中断功能(类型)

更新:根据同一文档,gdb应该要求用户选择一些重载方法:

GDB为您提供了针对不同可能断点的编号选项菜单,并通过提示>'. The first two options are always[0]取消'和"[1]全部" 等待您的选择.键入1在每个函数定义中设置断点,键入0将中止break命令而不设置任何新断点.

例如,以下会话摘录显示尝试在重载的符号String :: after上设置断点.我们选择该函数名的三个特定定义:

(gdb) b String::after
[0] cancel
[1] all
[2] file:String.cc; line number:867
[3] file:String.cc; line number:860
[4] file:String.cc; line number:875
[5] file:String.cc; line number:853
[6] file:String.cc; line number:846
[7] file:String.cc; line number:735
> 2 4 6
Breakpoint 1 at 0xb26c: file String.cc, line 867.
Breakpoint 2 at 0xb344: file String.cc, line 875.
Breakpoint 3 at 0xafcc: file String.cc, line 846.
Multiple breakpoints were set.
Use the "delete" command to delete unwanted
 breakpoints.
(gdb)
Run Code Online (Sandbox Code Playgroud)

UPDATE1:http://sourceware.org/gdb/onlinedocs/gdb/Ambiguous-Expressions.html#Ambiguous-Expressions表示可以打开和关闭此菜单(默认为关闭):

设置多符号模式

此选项允许您在表达式不明确时调整调试器行为.默认情况下,mode设置为all.如果使用表达式的命令允许多个选项,则gdb会自动选择所有可能的选项.

当mode设置为ask时,调试器总是在检测到歧义时使用菜单.

最后,当mode设置为cancel时,调试器会因模糊而报告错误,并且命令将被中止.

  • 这里的问题是GDB如何知道用户想要什么.有些用户希望将断点设置为所有重载版本,而某些用户只希望将断点设置为某些版本.如果用户给出'不明确表达式'(不带参数的函数名),gdb会将断点设置为所有版本(但是,请参阅Update1,gdb可能会询问您该怎么做).如果用户给出带参数的函数名,gdb将只设置单个断点.GDB只是尽力争取用户. (2认同)
  • 不是数字,而是类型。例如:`b X::X()`、`b X::X(int)` (2认同)