2012-01-19 89 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