簡體   English   中英

如何使用 GDBSERVER 在 Android 上調試應用程序?

[英]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 中啟動應用程序涉及幾個步驟

  1. system_server 進程接收請求您的應用程序的意圖。
  2. zygote 進程被告知 fork 一個新進程並運行您的類的方法。
  3. 您的應用程序在新進程中運行。

雖然您不能通過將可執行文件傳遞給 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 文件夾中復制了它:

  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(第二列)
  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. 開始調試。
/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM