GDB:警告:重载方法上设置了多个断点
GDB: warning: Multiple breakpoints were set on overloaded methods
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)
我认为,这种情况是正常的。一些ABI会为一个类生成两个构造函数。当您请求b X::X
时,gdb将检测两个构造函数并设置两个断点。(对不起,这不是你的情况)
设置了多个断点。对于重载的方法(这是你的情况)也可能给出警告:http://www.delorie.com/gnu/docs/gdb/gdb_36.html
一些编程语言(特别是c++)允许在不同的上下文中多次定义一个函数名。这就是所谓的超载。当函数名被重载时,' break function'不足以告诉GDB你想在哪里设置断点。
对于这样的方法,您可以通过键入其类型来选择一个方法:
分解函数(类型)
更新:根据同一文档,gdb应该要求用户选择一些重载的方法:
GDB为不同可能的断点提供了一个编号选项菜单,并等待您的选择,提示
>'. 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说这个菜单可以打开和关闭(默认是关闭):
set multiple-symbols mode
此选项允许您在表达式有歧义时调整调试器行为。缺省情况下,mode设置为all。如果使用该表达式的命令允许多个选项,那么gdb将自动选择所有可能的选项。
当mode设置为ask时,调试器总是在检测到歧义时使用菜单。
最后,当mode被设置为cancel时,调试器报告一个由于歧义而导致的错误,命令被终止。
- 在 vscode 中运行时无法暂停或设置断点
- 如何在进入动态打开的共享库时设置断点?
- 代码在 msvcrt .dll函数上设置断点失败
- 如何在引用上设置数据断点
- 如何在 gdb 中的所有构造函数上同时为 C++ 对象设置断点?
- 使用 gdb 在模块中的特定行设置断点
- 无法设置断点以查看错误C 有序列表
- C vs 2017设置全局变量 - 程序仅在调试中使用断点
- 使用Visual Studio Code和CMake调试OpenGL(使用GLEW&GLFW),无法设置断点
- 如何修复此错误:在malloc_error_break中设置断点以进行调试
- 如何在 Visual Studio 中基于字符串比较设置条件断点
- 在malloc_error_break中设置断点以在C++中调试
- 如何在共享库中的确切行号上设置一个断点
- 是否使用通配符设置断点
- 在Visual Studio中的dll中的函数处设置断点
- 正在设置断点,但未命中断点
- 如何在gdb中为函数的所有调用设置断点
- 在MSVS 2010中同时设置多个断点
- 在共享对象文件中设置 GDB 断点
- LLDB:通过控制台为malloc_error_break设置断点