2

NDKr6bを使用して2.3.6デバイスでマルチスレッドAndroidアプリをデバッグしようとしています。私もNDKr8を使ってみましたが、同じ結果になりました。ブレークポイントに到達するたびに、アプリがクラッシュします。「スレッドのサポート」セクションのNDKr5bドキュメントで説明されているケースに入っているようです。

これが実際に意味することは次のとおりです。

-Android 2.3を使用している場合、または以前のプラットフォームリリースで
  プラットフォームのバグ修正がバックポートされ、ネイティブでデバッグできるようになります
  自動的にスレッドします。

-そうでない場合は、メインスレッドのみをデバッグできます
  (以前のNDKリリースと同様)。次のメッセージも表示されます
  ndk-gdbを起動するとき(gdbプロンプトの直前):

     このAndroidプラットフォームでは、スレッドのデバッグはサポートされていません。

  非メインスレッドで実行される関数にブレークポイントを設定すると、
  プログラムは終了し、GDBに次のメッセージが表示されます。

        プログラムはシグナルSIGTRAP、トレース/ブレークポイントトラップで終了しました。
        プログラムはもう存在しません。

記載されている正確なエラーが表示されます。Thread debugging is unsupported on this Android platform!ndk-gdbを実行するとわかるので、このケースに陥っていると思います。私が言ったように、私はジンジャーブレッドデバイスを使用してい<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="9"/>て、マニフェストにあるので、このケースに入る必要はありません。

クラッシュするために私が従う手順の詳細は次のとおりです。

  1. Eclipseからのデバッグを使用してアプリを起動します
  2. ネイティブライブラリがロードされるSystem.loadLibraryの後に設定したブレークポイントにヒットします
  3. 私のプロジェクトディレクトリで、ndk-gdb --force--verbose--startを実行します
  4. gdbが正常に起動し、接続されている
  5. gdbにブレークポイントを設定し、Eclipseで続行してから、gdbで続行します
  6. クラッシュ!

編集されたコンソールダンプについては、以下を参照してください。

なぜこれが起こるのかについてのフィードバックをいただければ幸いです。

$ ndk-gdb --force --verbose --start
Android NDKのインストールパス:/ Users / tony / Documents / android-ndk-r8
デフォルトのadbコマンドの使用:/ Users / tony / Documents / android-sdk-mac_86 / platform-tools / adb
見つかったADBバージョン:AndroidDebugBridgeバージョン1.0.29
ADBフラグの使用:
自動検出されたプロジェクトパスの使用:。
見つかったパッケージ名:com.mycompany.myapp
アプリケーションの対象となるABI:armeabi
デバイスAPIレベル:10
デバイスCPUABI:armeabi-v7a armeabi
互換性のあるデバイスABI:armeabi
gdb setup initの使用:./ libs / armeabi / gdb.setup
ツールチェーンプレフィックスの使用:/Users/tony/Documents/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-
アプリ出力ディレクトリの使用:./ obj / local / armeabi
デバッグ可能なフラグが見つかりました:true
見つかったデバイスgdbserver:/data/data/com.appMobi.applab/lib/gdbserver
見つかったデータディレクトリ:'/data/data/com.mycompany.myapp'
最初に起動可能なアクティビティが見つかりました:.MainActivity
起動アクティビティ:com.mycompany.myapp / .MainActivity
##コマンド:/ Users / tony / Documents / android-sdk-mac_86 / platform-tools / adb shell am start -n com.mycompany.myapp / .MainActivity
開始:インテント{cmp = com.mycompany.myapp / .MainActivity}
警告:アクティビティは開始されていません。現在実行中の最上位のインスタンスにインテントが配信されています。
##コマンド:/ Users / tony / Documents / android-sdk-mac_86 / platform-tools / adb shell sleep 2
実行中のPIDが見つかりました:7341
gdbserverを正常に起動しました。
ネットワークリダイレクトを設定する
##コマンド:/ Users / tony / Documents / android-sdk-mac_86 / platform-tools / adb forward tcp:5039 localfilesystem:/data/data/com.mycompany.myapp/debug-socket
##コマンド:/ Users / tony / Documents / android-sdk-mac_86 / platform-tools / adb shell run-as com.appMobi.applab lib / gdbserver + debug-socket --attach 7341
##コマンド:/ Users / tony / Documents / android-sdk-mac_86 / platform-tools / adb pull / system / bin / app_process ./obj/local/armeabi/app_process
添付; pid = 7341
sockaddrソケットのデバッグソケットをリッスンしています
184 KB / s(0.030秒で5720バイト)
デバイス/エミュレーターからapp_processをプルしました。
##コマンド:/Users/tony/Documents/android-sdk-mac_86/platform-tools/adb pull /system/lib/libc.so ./obj/local/armeabi/libc.so
4347 KB / s(0.061秒で273940バイト)
デバイス/エミュレーターからlibc.soをプルしました。
GNU gdb 6.6
Copyright(C)2006 Free Software Foundation、Inc.
GDBはGNUGeneralPublic Licenseの対象となる自由ソフトウェアであり、あなたは
特定の条件下で変更および/またはコピーを配布することを歓迎します。
「showcopying」と入力して条件を確認します。
GDBの保証は一切ありません。詳細については、「保証の表示」と入力してください。
このGDBは、「-host = x86_64-apple-darwin --target=arm-elf-linux」として構成されました。
(デバッグシンボルが見つかりません)
共有ライブラリセクションのマッピング中にエラーが発生しました:

...共有ライブラリマッピングエラーが省略されました...

このAndroidプラットフォームでは、スレッドのデバッグはサポートされていません。
このAndroidプラットフォームでは、スレッドのデバッグはサポートされていません。
警告:ダイナミックリンカブレークポイント関数が見つかりません。
GDBは共有ライブラリ初期化子をデバッグできなくなります
明示的にロードされた動的コードを追跡します。
警告:共有ライブラリハンドラーがブレークポイントを有効にできませんでした
/Developer/AppMobiAndroid/AppLab/obj/local/armeabi/libc.soからのepoll_wait()の0xafd0c5ac
このAndroidプラットフォームでは、スレッドのデバッグはサポートされていません。
(gdb)break dcanvas.cpp:544
0x81833c8aのブレークポイント1:ファイル/Developer/AppMobiAndroid/AppLab/jni/dcanvas.cpp、行544。
(gdb)c
続行します。

子はシグナル=5で終了しました

プログラムはシグナルSIGTRAP、トレース/ブレークポイントトラップで終了しました。
プログラムはもう存在しません。
(gdb)
シグナル=0x5で終了した子(SIGTRAP)
GDBserverが終了します
4

1 に答える 1

0

ブレークポイントにヒットしたときにクラッシュする理由はbionic、Android 2.3.6 バージョンに付属する lib のバージョンにあると思われます。おそらく、ライブラリがスレッド化をサポートできないか、ライブラリが壊れています。

bioniclib は、Android プラットフォーム用のネイティブ標準 C コード API を提供するコア ランタイム ライブラリです。を考えることができればglibc、そこから遠く離れていません。

代わりにできる最善の方法は、ネイティブ コードを変更し、logcat をスパムして、実行中にたどられたパスを確認し、それを取り除くことです。

于 2012-06-25T22:49:03.640 に答える