如何在gdb中为C ++对象在所有构造函数上同时设置断点?

时间:2017-08-17 11:28:47

标签: c++ constructor gdb breakpoints

我有一个C ++对象,它有20个左右的构造函数,我想知道哪个特定的构造函数被调用。

2 个答案:

答案 0 :(得分:2)

您可以使用rbreak。见documentation

  

rbreak regex

     

在与正则表达式匹配的所有函数上设置断点   正则表达式。此命令在所有匹配项上设置无条件断点,   打印它设置的所有断点的列表。一旦这些断点出现了   设置,它们被视为与中断设置的断点一样   命令。您可以删除它们,禁用它们或使它们成为条件   与任何其他断点一样。

示例:

class Foo {
public:
  Foo() {}
  Foo(int) {}
};

int main() {
  Foo f1;
  Foo f2(1);
  return 0;
}

gdb session:

[ ~]$ gdb -q a.out 
Reading symbols from a.out...done.
(gdb) rbreak Foo::Foo
Breakpoint 1 at 0x4004dc: file so-rbr.cpp, line 3.
void Foo::Foo();
Breakpoint 2 at 0x4004eb: file so-rbr.cpp, line 4.
void Foo::Foo(int);
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004dc in Foo::Foo() at so-rbr.cpp:3
2       breakpoint     keep y   0x00000000004004eb in Foo::Foo(int) at so-rbr.cpp:4
(gdb)

答案 1 :(得分:0)

只需运行break myNamespace::myClass::myClass,gdb就会在每个构造函数上中断。

例如,如果要中断任何具有至少2个构造函数的runtime_error的创建,则可以运行break std::runtime_error::runtime_error。 gdb输出将是这样的:

Breakpoint 4 at 0xaf20 (4 locations)

这表明断点设置为多个构造函数。要检查运行info breakpoints的断点的位置,将提供如下输出:

Num     Type           Disp Enb Address            What
1       breakpoint     keep y   <MULTIPLE>         
1.1                         y     0x000000000000af20 <std::runtime_error::runtime_error(char const*)@plt>
1.2                         y     0x000000000000b300 <std::runtime_error::runtime_error(std::runtime_error const&)@plt>
1.3                         y     0x000000000000b460 <std::runtime_error::runtime_error(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@plt>
1.4                         y     0x000000000000b5e0 <std::runtime_error::runtime_error(char const*)@plt>