継承クラスの関数をデバッグするには、次の方法を使用できます。関数が派生クラスでオーバーライドされている場合でも、gdb の "break" コマンドを使用してブレークポイントを設定します。派生クラス関数の例外をキャッチするには、gdb の「catch」コマンドを使用します。 Clang の「-gsplit-dwarf」コンパイル オプションを使用して、個別の DWARF デバッグ情報エントリを生成します。
C 関数のデバッグの詳細な説明: 継承されたクラスの関数のデバッグ
C で継承されたクラスの関数をデバッグすると、次のような問題が発生する可能性があります。難しいです。これは、関数が基本クラスで定義されていても派生クラスから呼び出される場合、デバッガーが基本クラス関数にブレークポイントを設定することが多いためです。これにより、派生クラスでオーバーライドされた関数に直接アクセスできなくなるため、デバッグ プロセスが困難になる可能性があります。
この問題を解決するには、次の手法を使用できます。
1. gdb の「break」コマンドを使用します。
gdb の「break」コマンドを使用すると、次のことが可能になります。関数が派生クラスでオーバーライドされる場合でも、ブレークポイントを設定します。このコマンドを使用するには、まず派生クラス関数のアドレスを取得します。次に、次の構文を使用してブレークポイントを設定します。
(gdb) break *0x12345678
ここで、0x12345678
は派生クラス関数のアドレスです。
2. gdb の「catch」コマンドを使用する
gdb の「catch」コマンドも便利なデバッグ ツールです。これにより、派生クラス関数で例外をキャッチできるようになります。このコマンドを使用するには、次の構文を使用します。
(gdb) catch throw C++Exception
ここで、C Exception
は例外タイプです。
3. Clang の「-gsplit-dwarf」コンパイル オプションを使用する
Clang コンパイラには、「-gsplit-dwarf」というコンパイル オプションが用意されています。このオプションは、派生クラス関数の個別のエントリを含む DWARF デバッグ メッセージを生成します。これにより、デバッガーが派生クラス関数を見つけやすくなります。
実践的なケース
次のコード例を考えてみましょう:
class Base { public: void foo() { std::cout << "Base::foo()" << std::endl; } }; class Derived : public Base { public: void foo() override { std::cout << "Derived::foo()" << std::endl; } }; int main() { Derived d; d.foo(); }
Derived::foo()
をデバッグするには関数の場合、次の手順を使用できます。
Derived::foo()
関数のアドレスを取得します。 (nm a.out | grep Derived::foo)
これにより、次のような出力行が実行されます:
0x12345678 T Derived::foo
(gdb a.out)
(gdb) break *0x12345678
(gdb) run
Derived::foo()
が実行されると一時停止します。関数が呼び出されます。 これらのヒントを使用すると、継承されたクラスの関数の問題を簡単にデバッグできます。
以上がC++ 関数のデバッグの詳細な説明: 継承されたクラスの関数の問題をデバッグするには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。