2010-07-13 65 views
7

我正在將一個複雜的C應用程序移植到Android上,作爲一個SO庫,它包裝着一層薄薄的java層。 經過幾個小時的麻煩,我有Android下的代碼編譯,但當然,應用程序崩潰:但當然,應用程序崩潰:(調試Android NDK,在windows下

環顧四周後,我明白在Android下調試C應用程序的唯一方法是由gdb。 「T有很多使用gdb的經驗,任何一個在那裏可以分享一些見解?

任何人有windows下:)對GDB的教程?

THX

+0

不錯,但我不能訪問它: ( – Noam 2010-07-14 06:05:57

+0

@ognian你的帳戶與鏈接被暫停......大聲笑我也不知道這個問題的答案,因爲我跟着asnwers鏈接,發現解決方案也沒有工作。 – JPM 2011-12-07 16:28:35

回答

8

的最新版本NDK的(我用R7C),就可以構建調試版本由

  1. 添加android:debuggable="true"標誌<Application>標籤在AndroidManifest.xml
  2. 調用ndk-buildNDK_DEBUG=1 (NDK_DEBUG標誌不是必要的,如果在運行使用UNIX殼NDK-建立)

在Windows上,事情變得有點棘手,因爲使用ndk-gdb,你還是需要的bash(或Cygwin的)作爲NDK R7C的,但ndk-build在Cygwin的bash的運行會遇到權限問題,如果你曾經使用任何預構建的靜態庫

我的Windows機器的解決方案是

  1. 添加android:debuggable="true"標誌<application標籤在AndroidManifest.xml(與上述相同)
  2. 在CMD(窗口命令提示):調用ndk-buildNDK_DEBUG=1
  3. 在Cygwin的bash下運行ndk-gdb

對本地so庫的快速初步調查,創建一個簡單的活動有一個按鈕來觸發庫入口函數和loadLibrary的活動,如:

class MyActivity extends Activity { 
    static { 
     System.loadLibrary("mylibrary"); 
    } 

    /* other functions like onCreate, etc... */ 

    public native void libfunc(); 

    public void onClick(View v){ 
     libfunc(); 
    } 
} 

所以當gdb開始,問題庫實際上已加載,但在程序崩潰之前,您仍然可以有時間設置中斷點等;當你完成設置調試器,在(gdb)提示,鍵入continue(或只是'c'),然後點擊按鈕開始崩潰的程序和快樂調試...