2012-01-19 86 views
15

我正在嘗試調試並逐步瀏覽段落錯誤的Android應用程序。我試過ndk-gdb,但運氣不好。我也提到Android NDK Debugging而不能調試我的應用程序。調試Android NDK本地應用程序

當我嘗試ndk-gdb --start,我也得到:

$ ndk-gdb --start --verbose 
Android NDK installation path: /opt/android-ndk-r7 
Using default adb command: /opt/android-sdk-linux/platform-tools/adb 
ADB version found: Android Debug Bridge version 1.0.29 
Using final ADB command: '/opt/android-sdk-linux/platform-tools/adb' 
Using auto-detected project path: . 
Found package name: com.example.native_plasma 
ABIs targetted by application: armeabi armeabi-v7a 
Device API Level: 10 
Device CPU ABIs: armeabi-v7a armeabi 
Compatible device ABI: armeabi-v7a 
Found debuggable flag: true 
Found device gdbserver: /data/data/com.example.native_plasma/lib/gdbserver 
Using gdb setup init: ./libs/armeabi-v7a/gdb.setup 
Using toolchain prefix: /opt/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi- 
Using app out directory: ./obj/local/armeabi-v7a 
Found data directory: '/data/data/com.example.native_plasma' 
Found first launchable activity: android.app.NativeActivity 
Launching activity: com.example.native_plasma/android.app.NativeActivity 
## COMMAND: /opt/android-sdk-linux/platform-tools/adb shell am start -n com.example.native_plasma/android.app.NativeActivity 
Starting: Intent { cmp=com.example.native_plasma/android.app.NativeActivity } 
## COMMAND: /opt/android-sdk-linux/platform-tools/adb shell sleep 2 
Found running PID: 0 
ERROR: Could not extract PID of application on device/emulator. 
     Weird, this probably means one of these: 

     - The installed package does not match your current manifest. 
     - The application process was terminated. 

     Try using the --verbose option and look at its output for details. 

這表明應用程序segfaulted更少,但我不知道怎麼在這裏設置一個斷點,因爲GDB從來沒有真正給出一個提示。

我也試過這個命令:

我相信
$ ../../toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-addr2line -f -e libs/armeabi/libnative-plasma.so 
bedb2330 
?? 
??:0 

我有調試符號。

  • ndk-build -B V=1 APP_OPTIM=debug
  • Android.mkjni/LOCAL_CFLAGS := -g
  • ant debug

我也已經ndk-build NDK_DEBUG=1但我仍然得到它看起來像我沒有調試符號。

下面是堆棧跟蹤的圖像。到真正需要

Traceback

+0

我不知道這是否會幫助,但如果你正在尋找一些文檔(這是過時的,心,因爲它談到了NDK r5b),然後幾個月前我寫了一篇指南,你可以在這裏找到(http://www.doc.ic.ac.uk/~cb908/AndroidNDK.html)。恐怕我不能提供有關問題的更多見解,除了檢查該日誌中輸出的軟件包名稱與清單中的輸出名稱相同外(但我認爲它是,因爲它找到了數據目錄和內容) –

+0

謝謝。看起來你使用Eclipse。我正在使用命令行。我希望我不必使用Eclipse。 :\ – Scott

+0

啊,是的,我沒有想到這一點。原理應該是相同的 - 據我所知,Eclipse只顯示gdb輸出,並給gdb提供正確的命令(例如,當你點擊step按鈕時) - 所以不需要,你不需要使用它。你可以嘗試關閉LOCAL_CFLAGS中的優化(-O0我認爲),但我懷疑它會做很多事情。第一個斷點到應用程序有多遠? –

回答

11

好NDK_DEBUG = 1和調試的標誌清單中設置:它沒有得到任何更多的信息。當你構建應用程序時,在你的project/libs/armeabi中,應該有一個gdb.setup文件。那裏有符號搜索路徑,請檢查它是否有效。你試過這個:

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

看起來你正在得到一個空指針異常。

+0

花了幾乎一半美麗的陽光燦爛的舊金山日,我終於遇到了你的答案,瞧,我的斷點現在被啓動gdb按照你的規定啓動後,juno。非常感謝!! – Viren

7

在NDK和Eclipse插件,你可以右鍵單擊包並選擇調試爲的最新版本 - >Android原生應用

1

請確保您加載你的本地庫在任何一個啓動的活動或者在您的應用程序類中。否則,它不會工作,你會得到以下錯誤No symbol table is loaded. Use the "file" command.

例如,在應用程序類:

import android.app.Application; 

public class MyApp extends Application { 

    static { 
     System.loadLibrary("Name"); 
    } 

    public static native int doSomething(); 
} 

名稱是您的庫(.so文件)未經lib部分的名稱。

+0

非常感謝,4小時後就這樣做了! – marcus

0

我解決把--nowait選項shell命令:

ndk-gdb --start --verbose --nowait