Android NDK 定位出錯代碼位置

在Android開發中,我們經常遇到以下錯誤:

對於這種“Fatal signal xx (SIGSEGV)”的錯誤,如果我們只是做應用層開發的話,基本是懵逼和無能爲力的,因爲這種都是底層C或者C++代碼出現了錯誤(最多的就是空指針或者野指針導致的)。但是如果是我們自己寫的C或C++代碼出錯的話,那就能定位出錯位置並解決了。

一、製造錯誤

我們可以用Android Studio創建一個最簡單的NDK項目(如果不會創建NDK項目,可參考我前面《Android Studio通過cmake創建FFmpeg項目》博客),然後在自帶的C++代碼裏面添加我們自己的出錯代碼:

中間紅色框中的三句就是我們自己添加的代碼,運行是會報錯的,我們運行一下看看錯誤日誌(有的設備會屏蔽這個錯誤,所以可以考慮多換幾個設備測試):

二、找到出錯的內存地址

2.1、首先找到我們自己NDK項目編譯好後.so動態庫的名稱,AS中默認是“native-lib”,所以我們就要找到“libnative-lib.so”的錯誤地址:

這裏我們就找到了“libnative-lib.so”的錯誤地址是“00004f1d”,這樣就定位到了C++代碼出錯的地址了。

三、轉換獲取出錯的具體文件和行數

知道了出錯的地址後,就可以用NDK自帶的工具“arm-linux-androideabi-addr2line”進行定位(路徑:android-ndk-r14b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin),命令方式爲(Windows):arm-linux-androideabi-addr2line.exe -C -f -e ".so路徑" 錯誤內存地址。 如圖:

這樣我們就定位到了是在native-lib.cpp文件中的第14行出錯了,找到定位行(.so路徑是在AS中build文件夾中,可以參考上圖中路徑,最後.so的路徑要根據自己的設備CPU類型來旋轉,我這裏是armeab-v7a的):

這樣就知道了是memcpy這個函數調用錯了,糾其原因是buf指針沒有分配內存空間導致不能賦值,然後就可以改正瞭如下:

 

四、以上就是一種我們常用的定位NDK出錯的方式,簡單而快速。不過實際情況比這個更復雜多,有可能根本沒有明顯的錯誤地址給我們,那時我們就需要結合日誌、流程、註釋等手段綜合起來定位我們的錯誤,這也是一個孰能生巧的過程。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章