1

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;
}

=UPDATE 3============================================== =====================

gdb で可能であれば、コンパイラが提供する関数名もリストしたいと思います。

私の質問は、に投稿された質問に追加されています

gdbでクラスメソッドを一覧表示するには?

4

3 に答える 3

3

あなたは単純すぎるクラスを書きました。このアドバイス:

実行可能ファイルを 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;結果は 2 つの移動命令だけになり、関数呼び出しはありません。

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&)
于 2013-02-24T11:15:47.533 に答える
1

たとえば、break を使用する場合は、"break" スペース、一重引用符 (')、クラスの名前を入力し、TAB を押します。生成されたコードを含む候補が一覧表示されます。

いえbreak 'PotatoLaucher::<tab>

于 2013-02-18T16:23:22.147 に答える
1

実行可能ファイルを gdb にロードしたら、break(またはb) と入力してタブ キーを押します。これにより、gdb がブレークポイントを設定できるシンボルのリストが表示されます。多くの場合、gdb は本当にすべての可能性を表示するかどうかを尋ねてきます (何千もの可能性がある場合もあります)。

関数が何と呼ばれるかがある程度わかっている場合は、関数名の最初の数文字を入力してタブを押します。これにより、結果の数が管理可能なサイズに減少します。

于 2013-02-18T16:25:57.983 に答える