如何使用GDBSERVER在Android上调试应用程序?

cjs*_*rio 8 debugging java-native-interface android gdb gdbserver

我正在尝试调试我的应用程序通过JNI使用的本机共享库.我可以使用"gdbserver --attach pid"附加到正在运行的应用程序,但我需要在启动gdbserver命令时实际启动我的应用程序.

这个主题有一百万次博客点击,但似乎没有一个关于你如何推出你的应用程序.他们都说要输入"gdbserver 10.0.2.2:1234 ./MyProgram"但究竟是什么"MyProgram".那是MyProgram.apk吗?是MyProgram.so吗?是否在安装应用程序时创建了其他文件?如果是这样,它的路径是什么?

Tim*_*ger 5

虽然可以开发独立的应用程序,这些应用程序可以像其他人所描述的那样直接从外壳启动,但听起来您的代码在Android应用程序框架中运行。因此,您没有可执行文件,而是具有一个包含Dalvik类文件以及其他资源(包括本机共享库)的APK。

在APK中启动应用程序涉及几个步骤

  1. system_server进程收到请求您的应用程序的意图。
  2. 告诉合子进程派生一个新进程并运行您的类的方法。
  3. 您的应用程序将在新进程中运行。

虽然无法通过将可执行文件传递给gdbserver来直接启动APK,但使用am命令从外壳触发启动它相当容易。

$ 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 }
#
Run Code Online (Sandbox Code Playgroud)

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