2010-01-13 70 views
8

我試圖調試我的應用程序通過JNI使用本機共享庫。我可以附加到一個正在運行的應用程序只是「gdbserver的--attach PID」罰款,但我需要當我啓動gdbserver的命令來實際啓動我的應用程序。如何使用GDBSERVER在Android上調試應用程序?

有一百萬博客點擊率這個話題,但他們都不是清楚你如何啓動您的應用程序。他們都說只要輸入「gdbserver 10.0.2.2:1234 ./MyProgram」,但究竟是「MyProgram」。那是MyProgram.apk嗎?它是MyProgram.so嗎?它是否安裝了應用程序時創建了一些其他文件?如果是這樣,它的路徑是什麼?

回答

4

雖然有可能開發出可以直接從殼爲他人所描述推出獨立的應用程序,這聽起來像你的代碼Android應用程序框架內運行。因此,您沒有可執行文件,而是有一個APK包含您的Dalvik類文件以及其他資源(包括您的本機共享對象)。

啓動在APK應用程序包括幾個步驟

  1. 的system_server過程中接收到一個請求的意圖您的應用程序。
  2. 受精卵過程叫叉掉一個新的進程和運行類的方法。
  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中附加和設置斷點。

4

谷歌提供給您的問題一個官方的解決方案: 'NDK-gdb' 的

它包含在NDK。 IIRC,它要求你在APK中捆綁gdbserver的副本; IIRC,如果您使用'ndk-build'構建APK並指定了適當的參數,則會自動發生。

請參閱谷歌在$ NDK /文檔/ NDK-BUILD.html和$ NDK /文檔/ NDK-GDB.html文檔

< /瑞安>

相關問題