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

 2023-01-20    302  

问题描述

我正在尝试调试我的应用程序通过JNI使用的本机共享库.我可以使用” GDBSERVER -ATTACH PID”附加到运行的应用程序上,但是当我启动GDBSERVER命令时,我需要实际启动我的应用程序.

关于这个主题有100万个博客命中,但似乎没有一个关于您如何启动应用程序的清楚.他们都说只键入” GDBSERVER 10.0.2.2:1234 ./myprogram”,但到底是” myprogram”.那是myprogram.apk吗?是myprogram.o吗?安装应用程序时是否会创建其他一些文件?如果是这样,它的路径是什么?

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

推荐答案

虽然可以开发可以直接从外壳启动的免费标准应用程序,但听起来您的代码在Android应用程序框架内运行.因此,您没有可执行文件,而是有一个包含Dalvik类文件的APK以及包括本机共享对象在内的其他资源.

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

  1. System_server进程接收了请求您的应用程序的意图.
  2. zygote过程被告知要分叉一个新的过程并运行您的班级方法.
  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 }
#

您的应用程序运行后,请像以前一样使用gdbserver –attach <pid>.如果您很幸运,您的应用程序会等待一些用户互动,然后再调用本机代码,使您有机会附加并将断点设置在GDB中.

其他推荐答案

Google提供了解决您问题的官方解决方案:’NDK-GDB’

它包含在NDK中. IIRC,它要求您在APK内部捆绑着GDBSERVER的副本; iirc,如果您使用” ndk-build”构建APK并指定了适当的参数.

请参阅$ ndk/docs/ndk-build.html和$ ndk/docs/ndk-gdb.html

中的Google的文档

其他推荐答案

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

  1. 从Android Studio首选项的SDK工具选项卡下载Android NDK.
  2. 将GDBSERVER复制到根系的设备:
    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(第二列)
  6. adb shell
  7. cd /data/local/tmp
  8. su -c ./gdbserver :<any-port-number> –attach <pid>(应用将冻结)

对于gdbclient可执行文件,我必须从 GDB源代码为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. 开始调试.

以上所述是小编给大家介绍的如何用GDBSERVER调试Android上的应用程序?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26197.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。