JNI(native部分)のデバッグ方法

1,747 views
Skip to first unread message

Kumakiri

unread,
Mar 15, 2010, 5:51:46 AM3/15/10
to 日本Androidの会
はじめまして。

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"という記述をよく目にするのですが、このファイルはどこにあるのでしょうか?

koba

unread,
Mar 15, 2010, 6:27:39 AM3/15/10
to 日本Androidの会
kobaです。
実は私もやったことはないのですが、わかるところだけ。

まず
> 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のライブラリがあるかもしれませんのでさがしてみてくださ
い。


Kumakiri

unread,
Mar 15, 2010, 8:03:48 AM3/15/10
to 日本Androidの会
kobaさん、お返事ありがとうございます。

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"です

l.b.

unread,
Mar 15, 2010, 1:23:54 PM3/15/10
to 日本Androidの会

 村上です。

 kobaさんの説明とほぼ同じですが...

 NDKでのビルドの場合、一旦$NDK_DIR/outディレクトリ以下にビルドされ、installコマンドで$NDK_DIR/apps以下にイ
ンストールされます。
 その際に、strip --strip-debugでデバッグシンボルが削除されています。

 out以下のバイナリはデバッグシンボルが残ったままなので、こちらの共有ライブラリをappsのライブラリに上書きすればデバッグシンボルを利用で
きるかと思います。

Kumakiri

unread,
Mar 16, 2010, 2:49:34 AM3/16/10
to 日本Androidの会
上村さん、ご助言ありがとうございます。

$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"ぐらいしか見当たりません。

うぅ~っ、やはり、このやり方は根本的に間違っているでしょうか…?

l.b.

unread,
Mar 17, 2010, 12:09:32 PM3/17/10
to 日本Androidの会

 村上です。

 http://pdk.android.com/online-pdk/guide/debugging_gdb.html
 のDetailed Instructions以下に設定すべき項目が記載されています。
 ただし、NDK利用ではなく、ソースツリーを利用した場合についての記述ですので、PATHなどは適宜読み替えてください。

 記述例はNativeアプリのデバッグなので、共有ライブラリのロードはgdbのshareオプションを使用する必要があるかもしれません。
 なお、記述にあるgdbclientはenvsetup.sh中の関数になります。

Reply all
Reply to author
Forward
0 new messages