JNIを利用した際のnative部分のデバッグ方法がわからず困っております。
皆さんは、どのように開発されているのでしょうか?
下記は、試行錯誤の末、諦めかけている方法です…。間違い等、ご指摘頂けると幸いです。
環境は Windows XP + Eclipse 3.5 + Android 2.1 + NDK 1.6 R1 + Cygwin を利用してお
ります。
# .soの作成
make APP=san-angeles
# Eclipse からエミュレータを起動(Java)
# アプリの起動を確認してから、コンソールにて
adb forward tcp:8888 tcp:5555
adb shell ps (※出力からsan-angelesのPIDを確認)
adb shell gdbserver :5555 --attach (PID)
> Attached; pid = 220
> Listening on port 5555
> Remote debugging from host 127.0.0.1
# と出力を確認してから別プロンプトにて、
build\prebuilt\windows\arm-eabi-4.2.1\bin\arm-eabi-gdb
(gdb) cd (プロジェクトフォルダ)
(gdb) directory (jniフォルダ)
(gdb) file libs\armeabi\libsanangeles.so
> Reading symbols from (プロジェクトフォルダ)/libs/armeabi/libsanangeles.so...(no debugging symbols found)...done.
# という警告がでます。Android.mk で LOCAL_CFLAGS := -g -O0 を指定しているのですが…
# 一応は読み込まれている?ようなので、そのまま接続
(gdb) target remote localhost:5555
> Remote debugging using localhost:5555
> warning: shared library handler failed to enable breakpoint
# さらに gdbserver 側の出力も、
> gdb: Unable to get location for thread creation breakpoint: requested event is not supported
となってしまい、ブレイクポイントなど、一切の機能が利用できない状態になってしまいます。
------
P.S.
"build/envsetup.sh"という記述をよく目にするのですが、このファイルはどこにあるのでしょうか?
まず
> P.S.
> "build/envsetup.sh"という記述をよく目にするのですが、このファイルはどこにあるのでしょうか?
このファイルはAndroidのソースを全部ダウンロードすれば手に入ります。
http://source.android.com/download
を参照してください。
> > Reading symbols from (プロジェクトフォルダ)/libs/armeabi/libsanangeles.so...(no debugging symbols found)...done.
これはもしかしてビルドした後にシンボルが除去(strip)されているのかもしれません。
fileコマンドを使って
file libsanangeles.so
としてみてください。
これでシンボルが除去されている場合は stripped
そうでなければ not stripped
とでるはずです。
strippedだった場合、どこか別の場所に同じファイル名でnot strippedのライブラリがあるかもしれませんのでさがしてみてくださ
い。
envsetup.shの件ですが、なるほど、Androidのソース本体だったんですか。
ありがとうございます。早速、チェックアウトしてみます。
> これはもしかしてビルドした後にシンボルが除去(strip)されているのかもしれません。
> fileコマンドを使って
> file libsanangeles.so
> としてみてください。
file libsanangeles.so
> libsanangeles.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped
一応"not stripped"となっていますので、除去はされていないと信じているのですが…
bin\DemoActivity.apk を解凍し、含まれる libsanangeles.so が除去済みになっていないかどうかも確かめたので
すが、結果は同じでした。
うぅ~ん、涙です...
------
P.S.
> adb forward tcp:8888 tcp:5555
上記一文は間違いで、正しくは"adb forward tcp:5555 tcp:5555"です
kobaさんの説明とほぼ同じですが...
NDKでのビルドの場合、一旦$NDK_DIR/outディレクトリ以下にビルドされ、installコマンドで$NDK_DIR/apps以下にイ
ンストールされます。
その際に、strip --strip-debugでデバッグシンボルが削除されています。
out以下のバイナリはデバッグシンボルが残ったままなので、こちらの共有ライブラリをappsのライブラリに上書きすればデバッグシンボルを利用で
きるかと思います。
$NDK_DIR/out/apps/ に出力されておりました libsanangeles.so を利用したところ、警告が表示されなくなりまし
た。
(gdb) file ../../../out/apps/san-angeles/libsanangeles.so
Reading symbols from (NDK)/out/apps/san-angeles/
libsanangeles.so...done.
接続した後、プログラムが停止するのですが、正しく再開する事ができません。
(gdb) target remote localhost:5555
Remote debugging using localhost:5555
warning: shared library handler failed to enable breakpoint
importGLInit () at apps/san-angeles/project/jni/importgl.c:154
(gdb) c
Continuing.
# コンティニュー後も画面は固まったまま(ビリビリ状態)です。
ホスト側のエラーも変わらず出力されています。
Remote debugging from host 127.0.0.1
gdb: Unable to get location for thread creation breakpoint: requested
event is not supported
apkを疑ったのですが、project\bin\DemoActivity.apk に含まれている .so は $NDK_DIR/out/
apps/ をコピーしたものと同様でした。
そもそもattachしているプロセスが違っているのかと疑ってもみましたが、関連していそうなの
が"com.example.SanAngeles"ぐらいしか見当たりません。
うぅ~っ、やはり、このやり方は根本的に間違っているでしょうか…?
http://pdk.android.com/online-pdk/guide/debugging_gdb.html
のDetailed Instructions以下に設定すべき項目が記載されています。
ただし、NDK利用ではなく、ソースツリーを利用した場合についての記述ですので、PATHなどは適宜読み替えてください。
記述例はNativeアプリのデバッグなので、共有ライブラリのロードはgdbのshareオプションを使用する必要があるかもしれません。
なお、記述にあるgdbclientはenvsetup.sh中の関数になります。