C++ で記述された外部スタティック ライブラリにリンクする iOS プロジェクトがあります。静的ライブラリは、動的にリンクされている libstdc++ によって実装された関数を呼び出します。たとえば、このライブラリの初期化関数を呼び出すと ( と呼びましょうfoo_init()
)、すぐに が呼び出されますsetlocale()
。
スタティック ライブラリは -g でコンパイルされます。つまり、デバッガ内のコードにステップ インするためのデバッグ シンボルが用意されています。に足を踏み入れることに成功しましたfoo_init()
。への呼び出しをステップ オーバーしようとするとsetlocale()
、XCode はそれを行いません。という関数で終わりますdyld_stub_setlocale
。jmp
この関数は、動的ロードと関数呼び出しを実行する単一の命令です。
Stepping Over/In/Out of を試しましたが、目的のdyld_stub_setlocale
場所に移動できず、 に戻りましたfoo_init()
。Step Over と Step In は で終了しstub_helpers
、Step Out は continue のように動作します。Step Over/In inside を試すとstub_helpers
、XCode のシングル ステップとスタック ウィンドウの表示foo_init()
が に変わります??
。この時点で、ステップイン/ステップアウトの種類の決定ツリーが爆発するので、これ以上の詳細には触れませんが、私が試した組み合わせは、 への呼び出し後に行に戻ることはありませんでしたsetlocale
。
行にブレークポイントを設定し、続行を押して動作させることはできますが、これはあまり慣れていない静的ライブラリをデバッグするためのスケーラブルなソリューションではありません。
動的ローダーの問題を回避できるように、代わりに libstdc++-static をリンクする方法を見つけようとしましたが、Apple は新しい SDK からライブラリを削除したため、古いものはありません。
デバッガーがコードを解読しやすくするためのリンカーまたはコンパイラ オプションはありますか?