6

Windows で Eclipse (Kepler) を使用して NDK プロジェクトをデバッグしようとしていますが、検索パスのスラッシュの方向が正しくないため、GDB は .so ファイルのシンボルを検出できません。NDK r9 と SDK 22.2.1 を使用して、アプリケーションを実行しようとすると、GDB に次のように表示されます。

警告: 64 個のライブラリ (/system/bin/linker など) の共有ライブラリ シンボルを読み込めませんでした。

完全なリストを表示するには、「info sharedlibrary」コマンドを使用します。

「set solib-search-path」または「set sysroot」が必要ですか? 警告: 動的リンカー ブレークポイント関数が見つかりません。

GDB は最終的に再試行します。その間、GDB が共有ライブラリ初期化子をデバッグできないか、dlopen() の後に保留中のブレークポイントを解決できない可能性があります。

シンボル テーブルは読み込まれません。「ファイル」コマンドを使用します。

シンボル テーブルは読み込まれません。「ファイル」コマンドを使用します。

シンボル テーブルは読み込まれません。「ファイル」コマンドを使用します。

ライブラリに設定されたブレークポイントごとに、「シンボル テーブルが読み込まれていません...」という行が 1 回表示されます。問題は、検索パスにスラッシュではなくバックスラッシュが含まれているため、GDB がストリップされていない .so ファイルを見つけられないことです。プログラムを一時停止して次の GDB コマンドを実行すると、次のような出力が得られます。

show solib-search-path

The search path for loading non-absolute shared library symbol files is C:\\Users\\Username\\Projects\\Project\\Android/obj/local/armeabi-v7a/.

info shared

From        To          Syms Read   Shared Object Library
0x4003fff0  0x4006db40  Yes         C:/Users/Username/Projects/Project/Android/obj/local/armeabi-v7a/libc.so
0x5bda8598  0x5bf5aa50  No          C:/Users/Username/Projects/Project/Android/obj/local/armeabi-v7a/libProject.so

次に、スラッシュを使用するように solib-search-path を更新すると、次のようになります。

set solib-search-path C:/Users/Username/Projects/Project/Android/obj/local/armeabi-v7a/
warning: Could not load shared library symbols for 74 libraries, e.g. /system/bin/linker.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
warning: Unable to find dynamic linker breakpoint function.
GDB will retry eventurally.  Meanwhile, it is likely
that GDB is unable to debug shared library initializers
or resolve pending breakpoints after dlopen().

info shared
From        To          Syms Read   Shared Object Library
0x4003fff0  0x4006db40  Yes         C:/Users/Username/Projects/Project/Android/obj/local/armeabi-v7a/libc.so
0x5bda8598  0x5bf5aa50  Yes         C:/Users/Username/Projects/Project/Android/obj/local/armeabi-v7a/libProject.so

その後、GDB はネイティブ コードのブレークポイントに正常にヒットします。libs\armeabi-v7a フォルダーの gdb.setup ファイルには次の行があります。

set solib-search-path ./obj/local/armeabi-v7a

しかし、このパスが絶対パスに変更される場所がわかりません。GDB がスラッシュの代わりにバックスラッシュを使用するパスを使用するのはその時点だと思いますが、それがどこで発生するかはわかりません。gdb.setup ファイルを作成する Android NDK ビルド スクリプトを変更してみたり、別のパスを入れてみたりしましたが、show solib-search-path からの出力はまったく同じだったので、GDB がその検索パスを使用します。以前にこの問題に遭遇した人はいますか、またはEclipseから実行したときにGDBを正しい検索パスで起動する方法を知っている人はいますか?

4

1 に答える 1