2010-01-13 57 views
8

我试图调试我的应用程序通过JNI使用本机共享库。我可以附加到一个正在运行的应用程序只是“gdbserver的--attach PID”罚款,但我需要当我启动gdbserver的命令来实际启动我的应用程序。如何使用GDBSERVER在Android上调试应用程序?

有一百万博客点击率这个话题,但他们都不是清楚你如何启动您的应用程序。他们都说只要输入“gdbserver 10.0.2.2:1234 ./MyProgram”,但究竟是“MyProgram”。那是MyProgram.apk吗?它是MyProgram.so吗?它是否安装了应用程序时创建了一些其他文件?如果是这样,它的路径是什么?

回答

4

虽然有可能开发出可以直接从壳为他人所描述推出独立的应用程序,这听起来像你的代码Android应用程序框架内运行。因此,您没有可执行文件,而是有一个APK包含您的Dalvik类文件以及其他资源(包括您的本机共享对象)。

启动在APK应用程序包括几个步骤

  1. 的system_server过程中接收到一个请求的意图您的应用程序。
  2. 受精卵过程叫叉掉一个新的进程和运行类的方法。
  3. 您的应用程序在新的进程中运行。

尽管无法通过将可执行文件传递给gdbserver来直接启动APK,但使用am命令可以很容易地从shell启动它。

$ adb -d shell 
# am 
usage: am [subcommand] [options] 

    start an Activity: am start [-D] <INTENT> 
     -D: enable debugging 

    send a broadcast Intent: am broadcast <INTENT> 

    start an Instrumentation: am instrument [flags] <COMPONENT> 
     -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT) 
     -e <NAME> <VALUE>: set argument <NAME> to <VALUE> 
     -p <FILE>: write profiling data to <FILE> 
     -w: wait for instrumentation to finish before returning 

    start profiling: am profile <PROCESS> start <FILE> 
    stop profiling: am profile <PROCESS> stop 

    <INTENT> specifications include these flags: 
     [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>] 
     [-c <CATEGORY> [-c <CATEGORY>] ...] 
     [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...] 
     [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...] 
     [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...] 
     [-n <COMPONENT>] [-f <FLAGS>] [<URI>] 


# am start -n com.android.browser/.BrowserActivity 
Starting: Intent { cmp=com.android.browser/.BrowserActivity } 
# 

一旦您的应用程序正在运行,使用gdbserver --attach <pid>就像您以前一样。如果幸运的话,您的应用程序会在调用您的本机代码之前等待一些用户交互,以便您有机会在GDB中附加和设置断点。

4

谷歌提供给您的问题一个官方的解决方案: 'NDK-gdb' 的

它包含在NDK。 IIRC,它要求你在APK中捆绑gdbserver的副本; IIRC,如果您使用'ndk-build'构建APK并指定了适当的参数,则会自动发生。

请参阅谷歌在$ NDK /文档/ NDK-BUILD.html和$ NDK /文档/ NDK-GDB.html文档

< /瑞安>

相关问题