列出gdb中类的所有函数

时间:2013-02-18 16:19:14

标签: c++ gdb g++

我正在尝试使用gdb学习调试。我有一个开始。

我只想知道是否可以列出类的所有函数,包括编译器提供的默认函数?

甚至不使用IDE和其他方式

由于

=============================================== ==============================

我正在尝试的代码:

#include <iostream>

class MyClass
{
    public:
        void Hello() {
        }
        int a;
};

int main(int argc, char **argv)
{
    MyClass a;
    MyClass b = a;
    MyClass c;
    c = a;
    return 0;
}

=更新3 ============================================ ========================

我还想列出编译器提供的函数名,如果可能的话,列在gdb中。

我的问题是在

发布的问题之外

How to list class methods in gdb?

3 个答案:

答案 0 :(得分:2)

你写的课太简单了。这个建议:

  

在gdb中加载可执行文件后,键入break(或b)并按Tab键。

一般是正确的,但在你的情况下,MinGW不会为MyClass创建任何内容。我用MinGW编译了你的程序并将其反汇编:

(gdb) disassemble /m main
Dump of assembler code for function main(int, char**):
13      {
   0x0040138c <+0>:     push   %ebp
   0x0040138d <+1>:     mov    %esp,%ebp
   0x0040138f <+3>:     and    $0xfffffff0,%esp
   0x00401392 <+6>:     sub    $0x10,%esp
   0x00401395 <+9>:     call   0x40193c <__main>

14          MyClass a;
15          MyClass b = a;
   0x0040139a <+14>:    mov    0xc(%esp),%eax
   0x0040139e <+18>:    mov    %eax,0x8(%esp)

16          MyClass c;
17          c = a;
   0x004013a2 <+22>:    mov    0xc(%esp),%eax
   0x004013a6 <+26>:    mov    %eax,0x4(%esp)

18          return 0;
   0x004013aa <+30>:    mov    $0x0,%eax

19      }
   0x004013af <+35>:    leave
   0x004013b0 <+36>:    ret

End of assembler dump. 

正如您所看到的只有移动说明。例如,您的分配c = a;只会导致两条移动指令而不会调用函数:

0x004013a2 <+22>:    mov    0xc(%esp),%eax
0x004013a6 <+26>:    mov    %eax,0x4(%esp)

正如您所看到的,编译器选择不为您的类生成任何内容。在我看来,你选择了太简单的例子来学习你想要的东西。

我让你的例子有点复杂

#include <iostream>

class MyClass
{
    public:
        void Hello()
        {
          std::cout << "Hello\n";
        }
        int a;
};

int main(int argc, char **argv)
{
    MyClass a;
    a.Hello();
    MyClass b = a;
    MyClass c;
    c = a;
    return 0;
}

并在gdb下打破我的节目:

(gdb) b MyClass
MyClass           MyClass::Hello()
(gdb) b MyClass

这是nm的输出:

D:\src-c++\test.names>nm -C ./m.exe | grep MyClass
00404060 r .eh_frame$_ZN7MyClass5HelloEv
00401c20 t .text$_ZN7MyClass5HelloEv
00401c20 T MyClass::Hello()
  

我只是想看看该类生成的默认函数是什么,如果没有写它

将您的成员类变量从'int a'更改为std :: string a,您将看到编译器生成的默认函数

#include <iostream>
#include <string>

class MyClass
{
public:
  void Hello() {
  }
  std::string a;
};

int main(int argc, char **argv)
{
  MyClass a;
  MyClass b = a;
  MyClass c;
  c = a;
  return 0;
}

这些是编译生成的函数:

>nm -C ./a.out | grep My
00000000004009b8 W MyClass::MyClass(MyClass const&)
0000000000400964 W MyClass::MyClass()
000000000040097c W MyClass::~MyClass()
0000000000400994 W MyClass::operator=(MyClass const&)

答案 1 :(得分:1)

例如,当使用break时,键入“break”空格单引号(')您的类的名称,然后点击TAB。 它会列出候选人,包括生成的代码。

即。 break 'PotatoLaucher::<tab>

答案 2 :(得分:0)

在gdb中加载可执行文件后,键入break(或b)并按Tab键。这将为您提供gdb可以设置断点的符号列表。通常gdb会询问您是否真的想要展示所有可能性(有时会有数千种可能性)。

如果您对可能调用的函数有所了解,请键入函数名称的前几个字符并单击选项卡。这会将结果数量减少到可管理的大小。