我正在尝试调试我的应用程序通过JNI使用的本机共享库。我可以使用“gdbserver --attach pid”附加到正在运行的应用程序,但我需要在启动gdbserver命令时实际启动我的应用程序。
在这个主题上有一百万个博客点击,但似乎没有一个关于你如何启动你的应用程序。他们都说要输入“gdbserver 10.0.2.2:1234 ./MyProgram”但究竟是什么“MyProgram”。那是MyProgram.apk吗?是MyProgram.so吗?是否在安装应用程序时创建了其他文件?如果是这样,它的路径是什么?
答案 0 :(得分:4)
虽然可以开发可以像其他人一样直接从shell启动的独立应用程序,但听起来你的代码在Android应用程序框架内运行。因此,您没有可执行文件,而是拥有一个包含Dalvik类文件的APK以及其他资源,包括您的本机共享对象。
在APK中启动应用程序需要几个步骤
虽然您无法通过将可执行文件传递给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 文件夹中复制了它:
adb push {android-sdk}/ndk/{version}/prebuilt/android-arm64/gdbserver/gdbserver /data/local/tmp
在插入设备的情况下运行 gdbserver:
adb shell su -c setenforce 0
adb shell ps | grep {package-name}
adb shell
cd /data/local/tmp
su -c ./gdbserver :<any-port-number> --attach <pid>
(应用将冻结)对于 gdbclient 可执行文件,我必须从 gdb source code 构建它才能为 Android 设备配置正确的架构 (arm64)。在单独的 mac 终端窗口/选项卡上:
cd gdb-10.1
./configure --target=aarch64-linux-android && make -j8 && sudo make install
aarch64-linux-android-gdb
set sysroot
target remote <phone-ip-address>:<port-number-above>
continue
(解冻应用)