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

时间:2010-01-13 12:57:45

标签: android debugging gdb java-native-interface gdbserver

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

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

3 个答案:

答案 0 :(得分:4)

虽然可以开发可以像其他人一样直接从shell启动的独立应用程序,但听起来你的代码在Android应用程序框架内运行。因此,您没有可执行文件,而是拥有一个包含Dalvik类文件的APK以及其他资源,包括您的本机共享对象。

在APK中启动应用程序需要几个步骤

  1. system_server进程收到请求您的应用程序的意图。
  2. zygote进程被告知要分叉一个新进程并运行你的类的方法。
  3. 您的应用程序在新流程中运行。
  4. 虽然您无法通过将可执行文件传递给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中附加和设置断点。

答案 1 :(得分:4)

Google为您的问题提供了官方解决方案:'ndk-gdb'

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

请参阅$ NDK / docs / NDK-BUILD.html和$ NDK / docs / NDK-GDB.html中的Google文档

&LT; /瑞恩&GT;

答案 2 :(得分:0)

对于 gdbserver 可执行文件,我只是从 Android SDK 的 NDK 文件夹中复制了它:

  1. 从 Android Studio 首选项的 SDK 工具选项卡下载 Android NDK。
  2. 将 gdbserver 复制到 root 设备: adb push {android-sdk}/ndk/{version}/prebuilt/android-arm64/gdbserver/gdbserver /data/local/tmp

在插入设备的情况下运行 gdbserver:

  1. adb shell su -c setenforce 0
  2. 在设备中,接受shell的超级用户访问权限
  3. 启动您要调试的应用
  4. adb shell ps | grep {package-name}
  5. 复制进程 ID(第 2 列)
  6. adb shell
  7. cd /data/local/tmp
  8. su -c ./gdbserver :<any-port-number> --attach <pid>(应用将冻结)

对于 gdbclient 可执行文件,我必须从 gdb source code 构建它才能为 Android 设备配置正确的架构 (arm64)。在单独的 mac 终端窗口/选项卡上:

  1. cd gdb-10.1
  2. ./configure --target=aarch64-linux-android && make -j8 && sudo make install
  3. aarch64-linux-android-gdb
  4. set sysroot
  5. target remote <phone-ip-address>:<port-number-above>
  6. continue(解冻应用)
  7. 开始调试。