2011-05-28 25 views
14

我有一個C++ Android應用程序,我試圖用ndk-gdb進行調試。應用程序確實使用多線程,但據推測ndk的r5支持多線程。另外,我甚至沒有達到gdb啓動的地步。我運行命令:在摩托羅拉手機上運行ndk-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,我沒有任何防火牆阻止該連接。我也在Ubuntu 11.04上開發。

EDIT2:嗯...這看起來像新的NDK(R 5 C),錯誤消息已經改變過:

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

是的,可調試設置爲true在清單,和所有本機代碼與構建:

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

'$ adb shell run-as net.leifandersen.mobile.android.marblemachine ls'是否有效? – 2011-06-08 02:57:22

+0

不,我得到:run-as:Package'net.leifandersen.mobile.android.marblemachine'是未知的,同樣,它看起來像這樣的事情的錯誤報告,但該包不是三級深:http://code.google.com/p/android/issues/detail?id=13965。另外,正如我所說的,該軟件包仍列在/data/system/packages.list中。 – 2011-06-08 04:45:25

回答

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

因此,很不幸,你的設備是不能夠與NDK-gdb的使用,因爲運行作爲不起作用。如果您想使用該設備,則必須擁有root權限。

編輯:

修改NDK-gdb的腳本來擺脫運行的依賴。它只適用於root權限('adb shell whoami'應該是'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 
+0

有了root權限,我將如何解決問題(甚至首先解決問題是什麼)?謝謝。 – 2011-06-08 15:38:06

+0

好吧,我更新了我的root權限答案。 – 2011-06-08 23:41:01

+1

它工作完美,謝謝。 – 2011-06-09 04:02:28

0

我也遇到過這個問題,發現它可能是由於包名太短造成的!

在Android 2.2系統上測試一個包含3個級別(例如:a.b.c)的應用程序的應用程序時,ndk-gdb將不起作用。將軟件包更改爲具有4個或更多級別(例如a.b.c.d)或在Android 2.3或更高版本上運行的軟件包可解決此問題。

查看http://code.google.com/p/android/issues/detail?id=13965瞭解更多信息。

2

我今天在運行MIUI ROM的三星Galaxy S上遇到了同樣的問題。 ndk-gdb總是報告「無法解壓縮包的數據目錄。你確定你安裝的應用程序是可調試的嗎?」

原來原因是由於/ data/data符號鏈接而導致運行不起作用。 Cyanogen用於定製ROM。刪除符號鏈接並將所有文件從/ datadata移動到/ data/data解決了問題。

氰2.3修復:

NDK-GDB依賴於「運行爲」命令,這本身使得一些上的/數據/數據目錄檢查。在氰2.3,它是一個符號鏈接,和運行爲失敗,隱蔽消息,並且NDK-GDB與返回失敗[2]:

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

一個變通是重建具有符號鏈接/數據/數據:

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/

希望我t幫助有類似問題的人。檢查運行項是否按預期工作。這不是因爲你的二進制文件不可調試。 ndk-gdb的錯誤信息非常具有誤導性。

1

有類似的問題和運行:

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

將輸出:

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

修復是卸載設備上然後從命令行重新安裝通過:

adb install MyApkFile.apk 
0

有此問題的另一個可能性是:如果您之前已將您的應用程序安裝爲系統應用程序(在/系統/應用程序),卸載它,然後再次安裝它作爲一個正常的應用程序。在這種情況下,可能會有一些文件仍然存在,即應用程序無法訪問,因爲它沒有權限。

我通過卸載我的應用程序並手動刪除與之相關的每一條信息(使用adb shell和root權限)來解決它。據我所知,包括:

  • 一切都在/數據/數據/ <您的應用程序包>
  • 名爲/數據/達爾維克緩存/ * <您的應用程序包> *
文件

再次安裝後,我能夠再次調試應用程序。

0

如果任何人使用三星Galaxy S4/...並得到4.4.2(最新股票ROM - 現在在所有國家) - 你搞砸了!三星的錯誤。所以根據上面的答案之一解釋,或得到另一個設備... 另一種解決方案是恢復到Android 4.2.2(不是4.4.2) - 前4.3版本開始這個問題。