2015-12-02 20 views
5

私は、C++、Objective-C、およびSwiftの混合物を使用するマルチスレッドOS Xアプリケーションを持っています。"libC++ abi.dylib:純仮想関数が呼び出されました!" Xcodeで

私のアプリケーションがシャットダウンしたとき、私はXcodeのデバッガウィンドウでこれを参照してください。

libc++abi.dylib: Pure virtual function called! 

私は、このエラーは通常、C++クラスのコンストラクタまたはデストラクタで仮想関数の呼び出しによって引き起こされていることを知っています。

どこにあるのか簡単に見つける方法はありますか? "簡単"とは、 "仮想関数を持つすべてのクラスのすべてのコンストラクタとデストラクタのすべての行に対してコールツリーを分析しない"という意味です。

スタックトレースが表示されません。このメッセージが表示されても、デバッガはプログラムを停止しません。私のアプリケーションの代理人のapplicationDidTerminateメソッドから記録されたメッセージがこのメッセージの前に表示されます。

私は、「すべての例外」にブレークポイントを設定しようとしたが、残念ながらそのブレークポイントは、例外の多くを使用するコードによって、多くの場合、ヒットしました。私はブレークポイントを置くことができる他のシンボルがありますか?

+0

は、デストラクタ内で仮想メソッドを呼び出すクラス、またはデストラクタ内のメソッドを実際に呼び出すクラスを見ています。これらのメソッド自体が仮想メソッドを呼び出す可能性があるからです。基底クラスのデストラクタでは、派生クラスは存在しなくなるため、仮想関数呼び出しは基底クラスのバージョンを実行します。 –

+0

通常は、エラーが例外 'SIGABRT'であるため、生成されたクラッシュログレポートがあります。イベントでは、 "仮想"のコードを検索し、それぞれにブレークポイントを設定することはできません。それは単に排除によってプロセスの問題でなければなりません。 –

+1

'__cxa_pure_virtual'にブレークポイントを設定してください –

答えて

3

C++標準ライブラリは、低レベルの言語/ライブラリ機能を実装するいくつかの "ABI"関数を定義しています。 libc++には、hereという素晴らしい文書があります。

そのうちの一つは、プログラムが何らかの形で純粋仮想関数を呼び出すときに呼び出され__cxa_pure_virtual、です。したがって、ブレークポイントを設定すると、そのブレークポイントがどこで発生しているかを知ることができます。 vtableが中間状態にあるときには、コンストラクタやデストラクタ内から仮想関数を呼び出すとき

は通常、純粋仮想関数呼び出しが起こります。詳細については、this answerを参照してください。

1

まずアップ、それは純粋仮想関数の呼び出しが行われなく、コンストラクタ(保証、しかし、そうではない)されているデストラクタで、ほとんど可能性があります。

純粋仮想関数が呼び出されたときにコンパイラによって例外が生成された場合は、set_terminate()(例:here)という独自の終了ハンドラを設定することで、それをキャッチすることができます。次に、終了ハンドラにブレークポイントを設定して、コードがそのポイントにどのように到達しているかを正確に確認できます。

純粋仮想関数は(可能性が高い状況)が呼び出されたときに例外は、コンパイラによって生成されていない場合は、問題のあるコールが発生している場所を絞り込む支援するために、独自のダミーのクラスを追加してみてください。これらのダミークラスをデストラクタに印刷するだけで、何かが発生したときに絞り込むのに役立ちます。たとえば、main()関数の最初に1を置き、そのメッセージが表示されたら、静的オブジェクトが削除されているときに、そのダミーオブジェクトがmain()が返される前に削除された最後のオブジェクトになるため、あなたは変更できる他のクラスの最初のデータメンバーのようなダミークラスを追加することで同様のことを行うことができますが、オブジェクトが削除されて純粋仮想関数呼び出しにつながるという考えが必要です。

最後にそれが有用である場合には、あなたが実際に純粋仮想関数の実装を提供することができ、これらは実際には(はい、これは法律上のC++である)と呼ばれることができます。正確な純粋仮想関数が呼び出されていることがわかっている場合は、その実装を提供し、そこにブレークポイントを置いてスタックトレースをキャッチします。これは、純粋な仮想関数が呼び出されていることを正確に知っていることに依存しています。

関連する問題