14

ndk-gdbでデバッグしようとしているC++Androidアプリケーションがあります。アプリケーションは複数のスレッドを使用しますが、おそらくndkのr5は複数のスレッドをサポートしています。また、gdbが起動するところまで到達していません。次のコマンドを実行します。

ndk-gdb --start --force --verbose

次に、ndkとsdk(または少なくともadb)の適切なパス、および必要なABIなどを見つけます。

$ ndk-gdb --start --force --verbose
Android NDK installation path: /home/leif/eclipse/android-ndk-r5b
Using default adb command: /home/leif/eclipse/android-sdk-linux_86/platform-tools/adb
ADB version found: Android Debug Bridge version 1.0.26
Using final ADB command: '/home/leif/eclipse/android-sdk-linux_86/platform-tools/adb'
Using auto-detected project path: .
Found package name: net.leifandersen.mobile.android.marblemachine
ABIs targetted by application: armeabi
Device API Level: 10
Device CPU ABIs: armeabi-v7a armeabi
Compatible device ABI: armeabi

次に、gdbサーバーを探し、適切なPIDを含めてそれを見つけ、アクティビティを開始します。

しかし、その後、パッケージが見つからないことがわかります。

Setup network redirection
## COMMAND: /home/leif/eclipse/android-sdk-linux_86/platform-tools/adb shell run-as <package name> lib/gdbserver +debug-socket --attach 16040
## COMMAND: /home/leif/eclipse/android-sdk-linux_86/platform-tools/adb forward tcp:5039 localfilesystem:run-as: Package '<package name>' is unknown/debug-socket

次に、adb(ヘルプファイル)を不適切に使用した場合に得られるものを吐き出し、続いて次のようにします。

ERROR: Could not setup network redirection to gdbserver?
       Maybe using --port=<port> to use a different TCP port might help?
run-as: Package '<package name>' is unknown

/data/system/packages.listを調べましたが、確かにapkはそこにあり、それが指している場所はファイルシステム上で正しいです。だからそれは問題ではありません。

このチュートリアル: http: //vilimpoc.org/blog/2010/09/23/hello-gdbserver-a-debuggable-jni-example-for-android/は、Eclipseビルドの削除と再インストール、およびクリーンアップを推奨しています。

パッケージのビルドにEclipseを使用しませんでしたが、すべてをクリーンアップして最初からコンパイルし、削除して、再インストールしました。

誰かが同様の問題を抱えていましたか、そしてどのようにそれらを解決しましたか?ありがとうございました。

編集:ああ、私は役に立たない別のポートを試しましたが、とにかく5039(デフォルトのポート)には何もないようです。そして、afaik、私はその接続をブロックするファイアウォールを持っていません。私はUbuntu11.04でも開発しています。

Edit2:うーん...新しいndk(r5c)のように見えますが、エラーメッセージも変更されました:

ERROR: Could not extract package's data directory. Are you sure that
       your installed application is debuggable?

はい、マニフェストではdebuggableがtrueに設定されており、すべてのネイティブコードは次のコードで構築されています。

LOCAL_CFLAGS           := -Wall -g
LOCAL_LDFLAGS          := -Wl,-Map,xxx.map
4

7 に答える 7

15
run-as: Package 'net.leifandersen.mobile.android.marblemachine' is unknown

したがって、残念ながら、run-asが機能しないため、デバイスをndk-gdbで使用することはできません。そのデバイスを使用する場合は、root権限が必要です。

編集:

ndk-gdbスクリプトを変更して、run-asの依存関係を取り除きます。これはroot権限でのみ機能します(「adbshel​​lwhoami」は「root」である必要があります)。

--- ndk-gdb 2011-02-24 16:55:07.000000000 +0900
+++ ndk-gdb-root    2011-06-09 08:35:04.000000000 +0900
@@ -465,7 +465,7 @@
 log "Using app out directory: $APP_OUT"

 # Find the <dataDir> of the package on the device
-DATA_DIR=`adb_shell run-as $PACKAGE_NAME /system/bin/sh -c pwd`
+DATA_DIR="/data/data/$PACKAGE_NAME"
 log "Found data directory: '$DATA_DIR'"
 if [ $? != 0 -o -z "$DATA_DIR" ] ; then
     echo "ERROR: Could not extract package's data directory. Are you sure that"
@@ -543,7 +543,7 @@

 # Launch gdbserver now
 DEBUG_SOCKET=debug-socket
-run $ADB_CMD shell run-as $PACKAGE_NAME lib/gdbserver +$DEBUG_SOCKET --attach $PID &
+run $ADB_CMD shell "(cd $DATA_DIR; lib/gdbserver +$DEBUG_SOCKET --attach $PID)" &
 if [ $? != 0 ] ; then
     echo "ERROR: Could not launch gdbserver on the device?"
     exit 1
于 2011-06-08T04:56:29.637 に答える
4

run-asにはバグがあり、インストールされているアプリが多すぎると失敗します。Evo 4Gからいくつかのアプリを削除することで、この問題を回避することができました。これはNDKディスカッショングループで見つかりました-http://groups.google.com/group/android-ndk/browse_thread/thread/ae9e8d5fe2716ae6?pli= 1

于 2011-11-13T04:15:32.957 に答える
2

私は今日、MIUIROMを実行しているSamsungGalaxySで同じ問題を抱えていました。ndk-gdbは常に「パッケージのデータディレクトリを抽出できませんでした。インストールされているアプリケーションがデバッグ可能であるかどうかを確認しますか?」と報告します。

その理由は、/ data/dataシンボリックリンクが原因でrun-asが機能していないことが判明しました。カスタマイズされたROMではシアンが使用されています。シンボリックリンクを削除し、すべてのファイルを/datadataから/data/dataに移動すると問題が解決しました。

Cyanogen 2.3の修正:

ndk-gdbは、「ru​​n-as」コマンドに依存しています。このコマンド自体が、/ data/dataディレクトリに対していくつかのチェックを行います。Cyanogen 2.3では、これはシンボリックリンクであり、run-asは不可解なメッセージで失敗し、ndk-gdbは[2]で失敗します。

ERROR: Could not extract package's data directory. Are you sure that
       your installed application is debuggable?

回避策は、シンボリックリンクを使用して/ data/dataを再作成することです。

cd /data/data /datadata.break-run-as
mkdir -m 771 /data/data/
chown system: v
mv /datadata/* /data/data/

http://en.wikibooks.org/wiki/OpenGL_Programming/Installation/Android_NDK

http://forum.cyanogenmod.com/topic/27657-run-as-not-working-due-to-datadata-symlink/

それが同様の問題を抱えている他の人に役立つことを願っています。run-asが期待どおりに機能するかどうかを確認します。バイナリがデバッグ可能でないためではありません。ndk-gdbのエラーメッセージは非常に誤解を招くものです。

于 2012-10-20T00:18:57.833 に答える
1

同様の問題が発生し、実行されていました:

adb shell run-as com.mypackagename /system/bin/sh -c pwd

出力します:

run-as: Package 'com.mypackagename' has corrupt installation

修正は、デバイスでアンインストールしてから、コマンドラインから次の方法で再インストールすることでした。

adb install MyApkFile.apk
于 2012-11-14T08:06:30.620 に答える
0

私もこの問題を経験し、短いパッケージ名が原因である可能性があることを発見しました!

3つのレベルのパッケージ(例:abc)を持つアプリケーションを使用してAndroid 2.2システムでテストする場合、ndk-gdbは機能しませんでした。パッケージを4つ以上のレベル(egabcd)に変更するか、Android 2.3以降で実行すると、問題が解決しました。

詳細については、 http://code.google.com/p/android/issues/detail?id=13965を参照してください。

于 2012-02-29T22:35:55.483 に答える
0

この問題が発生する可能性はさらにあります。以前にアプリケーションをシステムアプリとして(/ system / appに)インストールしたことがある場合は、それをアンインストールしてから、通常のアプリケーションとして再度インストールします。その場合、権限がないためにアプリケーションがアクセスできないファイルがまだ残っている可能性があります。

アプリケーションをアンインストールし、それに関連するすべての情報を手動で削除することで解決しました(adbシェルとroot権限を使用)。私の知る限り、それは以下を含みます:

  • / data / data/<アプリパッケージ>の下にあるすべて
  • / data / dalvik-cache /*<アプリパッケージ>*という名前のファイル

再度インストールした後、アプリケーションを再度デバッグすることができました。

于 2013-01-14T15:00:06.953 に答える
0

誰かがSamsungGalaxyS4 / ...を使用していて、4.4.2(最新のストックROM-今ではすべての国で)を入手した場合-あなたは失敗しました!サムスンのバグ。したがって、上記の回答の1つで説明されているようにルートするか、別のデバイスを入手してください...別の解決策は、Android 4.2.2(4.4.2ではなく)に戻すことです-この問題を開始した4.3より前のバージョン。

于 2015-01-18T11:42:13.087 に答える