【问题标题】:GDB: warning: Multiple breakpoints were set on overloaded methodsGDB:警告:在重载方法上设置了多个断点
【发布时间】:2011-09-07 07:37:04
【问题描述】:
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)

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

还是它预期的 GDB 有问题 用户删除它的烂摊子? 还是我错过了一点?

编辑 1.

对于以下代码:

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

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

        ~X () {}
};

我试过了:

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

没有帮助!

编辑 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) 

【问题讨论】:

  • 什么CPU有linux-dopx?
  • @osgx 不明白你想要什么信息。
  • linux-dopx 是基于 x86 还是 x86_64 CPU?还是ARM?
  • 好的 :) anisha@linux-dopx:~&gt; uname -a Linux linux-dopx 2.6.34-12-desktop #1 SMP PREEMPT 2010-06-29 02:39:08 +0200 x86_64 x86_64 x86_64 GNU/Linux

标签: c++ gdb breakpoints


【解决方案1】:

我认为,这种情况是正常的。一些 ABI 将为一个类生成两个构造函数。当您询问b X::X 时,gdb 将检测两个构造函数并设置两个断点。 (对不起,这不是你的情况)

“设置了多个断点”。重载方法也可能会发出警告(这是你的情况):http://www.delorie.com/gnu/docs/gdb/gdb_36.html

一些编程语言(尤其是 C++)允许多次定义一个函数名,以便在不同的上下文中应用。这称为重载。当函数名被重载时,`break function' 并不足以告诉 GDB 你想在哪里设置断点。

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

中断函数(类型)

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

GDB 为您提供一个带有编号选项的菜单,用于不同的可能断点,并在提示符&gt;'. The first two options are always [0] cancel' 和 `[1] all' 等待您的选择。键入 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)

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

设置多符号模式

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

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

最后,当 mode 设置为 cancel 时,由于不明确,调试器会报告错误并中止命令。

【讨论】:

  • GDB 在 10 个重载函数上设置 10 个断点是没有意义的,当只需要 1 个断点然后期望用户删除这个烂摊子,这就是我问这个问题的原因。跨度>
  • 这里的问题是GDB如何知道用户想要什么。一些用户希望为所有重载版本设置断点,而一些用户只想为某些版本设置断点。如果用户给出Ambiguous Expression(不带参数的函数名),gdb 将为所有版本设置断点(但是,请参阅 Update1,gdb 可能会询问您该怎么做)。如果用户给出带参数的函数名,gdb 将只设置一个断点。 GDB 只是尽最大努力去阻止用户。
  • 不是数字,而是类型。例如:b X::X()b X::X(int)
  • 是的,这行得通,谢谢。我会将输出放在第一篇文章中。
猜你喜欢
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 2016-11-26
  • 2018-08-08
  • 2018-12-15
  • 2012-03-29
相关资源
最近更新 更多