0

adbシェル、片側にgdbserver、反対側にndkのgdbを使用して、ネイティブビルド(NDK)実行可能テスト(+共有ライブラリ)をデバッグしようとしています。

実行可能ファイルと .so をデバイスにコピーし、adb シェルで実行しました。

$ gdbserver :5039 ./my_test my_args
Process ./my_test created; pid = 11131
Listening on port 5039

ホストで、同じ my_test 実行可能ファイルで gdb を実行します。

$ $NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gdb ./my_test

main() にブレークポイントを設定します。

Reading symbols from /.../my_test...done.
(gdb) target remote :5039
Remote debugging using :5039
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().
0xb6f71a60 in ?? ()
(gdb) b main
Cannot access memory at address 0x0
warning: (Internal error: pc 0xa468 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0xa468 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0xa468 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0xa46c in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0xa468 in read in psymtab, but not in symtab.)

...

リモートデバッグとしてEclipseにフックすると、コードを段階的に実行しようとすると、「次のステートメント」がコード内の別の場所にジャンプします。これは、gdb で一連の「next」コマンドを実行したときに表示されるものと同じです。

デバイスの gdbserver バージョンは 7.6 です。

何か案は?

アップデート:

gdb 7.6.2 をビルドし、私が持っている NDK リリース (r9d 64 ビット) に付属する gdb 7.3.1-gg の代わりにそれを使用した後、内部エラーの警告メッセージはなくなりました。

残っているのは、コードとデバッグの間の同期の欠如です。NDK_DEBUG=1 でコードをビルドし、実行可能ファイルと .so を .obj dir からデバイスにコピーしましたが、gdb+gdbserver から「ステップバイステップ」デバッグを実行しても、gdb から見たプログラム フローは表示されません。意味があります。

4

1 に答える 1

1

問題は解決しました。これで、gdb から見たプログラム フローは期待どおりに見えます。

これらは、実行されて機能するようになった2つのことです。

  1. 新しいバージョンの gdb をビルドします。NDK リリース (バージョン r9d) に付属する 7.3.1 の代わりに、gdb をダウンロードしてビルドし--target=arm-linux-gnueabi、使用しました。

  2. 以前はApplication.mk 内で指定-gしていました。APP_CPPFLAGS今回は指定し-ggdb -O0ました。

于 2014-09-01T11:39:19.510 に答える