Android ndk-gdb 調試


前提:保證NDK環境建立ok,可參考文章“Windwos下Android NDK開發環境搭建

若想在設備上使用,必須取得root權限才可。

注意在/home/用戶/.bash_profile中環境變量的配置:

以上配置是為保證編譯,調試過程能正確使用相關命令。

接下來以調試android ndk下samples中的hello-jni為例,來闡述調試過程。

由於:

The new NDK has a Windows version of ndk-build, but ndk-gdb is still a
bash script. This doesn't only mean that you need Cygwin to run it, it
also means that everything written in ndk-gdb is written from a Linux
standpoint.

所以,在windows下要用ndk-gdb的話,我們必須安裝Cygwin.

如果在Windwos下運行ndk-gdb的話,將會出現如下問題。

值得注意的是,我們還必須在Cygwin中,配置ANDROID_NDK_ROOT這個環境變量,配置方法參見”Windwos下Android NDK開發環境搭建“中所描述。

否則在使用ndk-build會出現如下問題:

awk fatal:Can't open source file ‘/cygdrive/d/android-ndk-r5c/samples/hello-jni/ D:\android-ndk-r5c/build/awk/check-awk.awk' for reading (no such file or directory)
Error:Could not run 'awk' command.Do you have it install properly?

解決方法來自:https://groups.google.com/forum/#!msg/android-ndk/_4JNdY_h558/vdzP-4CkQrUJ

接下來,將按照如下步驟來調試。

1、啟動Cygwin Terminal.

2、進入hello-jni的Android工程目錄

    $ cd $ANDROID_NDK_ROOT/samples/hello-jni

3、以調試模式構建c/c++程序,目的是生成共享庫,.so文件

  $ ndk-build NDK_DEBUG=1

這里我們使用 ndk-build NDK_DEBUG=1 生成帶符號表的 .so

或者修改AndroidManifest.xml,設置android:debuggable=true。

注意:從上面執行的結果可看到,除了得到編譯的動態共享庫,還有Gdbserver和Gdbsetup。如果不是設置為調試模式不會產生這兩個文件。

4、生成build.xml文件(用於用ant打包生成apk,見下面的步驟5)

   $ android update project -p . -t android-18   (在cygwin下,$ android.bat update project -p . -t android-18)

 

5、$ ant debug install

注1:如果在構建過程中出現如下錯誤:

[aapt] invalid resource directory name: C:\Users\Paul\git\XXXXXXXX\bin\res/crunch
在網上找到如下的解決方法:

本人是通過執行“ant clean debug install”來解決以上錯誤的。
注2:如果沒構建的工程,涉及到庫工程。則在構建過程中可能會出現類似如下錯誤:

則需在庫工程目錄下,為庫工程執行“ android.bat update project -p . -t android-18”來生成需要的build.xml文件。

6、啟動應用程序的ndk-gdb調試。

如果你要調試的程序沒有運行,需使用ndk-gdb --start。

如果你要調試的程序已經在運行了,直接運行ndk-gdb。

$ ndk-gdb --start

 

這時會啟動應用,接着就可以使用gdb的命令了。

7、用list或l命令查看C文件的內容.

(gdb) list

可以用list 1,100 或 l 1,100來指定顯示源文件的范圍。

如果遇到No symbol table is loaded. Use the "file" command.則需使用以下命令加載需要調試的so文件:
 file obj/local/armeabi/libhello-jni.so

8、用break 或 b命令設定斷點

(gdb) break 30 //將斷點設置在30行

9、查看斷點信息
(gdb) info breakpoints


10、使用c或者continue命令繼續運行程序。
(gdb) continue   

11、 按返回鍵再手動重啟應用(觸發程序運行在斷點處),就會停在30行斷點處了。(注意:如果停止了應用程序是不行的)

12、為了使程序繼續運行下去,執行continue命令。

注:在調試其他native程序時,如果在第10步出現錯誤:
  出現錯誤:
  Continuing.
  Warning:
  Cannot insert breakpoint 1.
  Error accessing memory address 0x11a0: Input/output error.
 錯誤原因:使用ndk-gdb --start 啟動程序第一個activity,但是此時so文件並沒有被加載。
 解決方法:首先打開程序並使用,在保證so文件已經被使用的情況下,調用ndk-gdb命令調試程序進程。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM