[英]How to debug an App on Android with GDBSERVER?
我正在嘗試調試我的應用程序通過 JNI 使用的本機共享庫。 我可以使用“gdbserver --attach pid”附加到正在運行的應用程序,但我需要在啟動 gdbserver 命令時實際啟動我的應用程序。
關於這個主題有 100 萬次博客點擊,但似乎沒有一個人清楚地說明您如何啟動您的應用程序。 他們都說只輸入“gdbserver 10.0.2.2:1234 .\/MyProgram”,但究竟什么是“MyProgram”。 那是 MyProgram.apk 嗎? 是 MyProgram.so 嗎? 它是在安裝應用程序時創建的其他文件嗎? 如果有,它的路徑是什么?
雖然可以像其他人描述的那樣開發可以直接從 shell 啟動的獨立應用程序,但聽起來您的代碼在 Android 應用程序框架內運行。 因此,您沒有可執行文件,而是有一個 APK,其中包含您的 Dalvik 類文件以及其他資源,包括您的本機共享對象。
在 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 中附加和設置斷點。
Google 為您的問題提供了官方解決方案:'ndk-gdb'
它包含在 NDK 中。 IIRC,它要求您在 APK 中捆綁了 gdbserver 的副本; IIRC,如果您使用“ndk-build”構建 APK 並指定適當的參數,這將自動發生。
請參閱 $NDK/docs/NDK-BUILD.html 和 $NDK/docs/NDK-GDB.html 中的 Google 文檔
</ryan>
對於 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 源代碼構建它,以便為 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
(解凍應用程序)/gdb-9.1/arm64/gdb/../../gdb/python/py-cmd.c:191: undefined reference to `PyUnicodeUCS2_Decode'
@Siklab.ph 抱歉,在編譯時出現 python 錯誤,然后我使用選項 ./configure --enable-unicode=ucs2 重新編譯 python
但得到了同樣的錯誤。
你有什么辦法解決嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.