天天看點

android .so 動态處理,Android:動态庫(.so)調試技巧

一、反彙編定位crash

①檢視crash log:

上圖已标出crash發生在 libdeflicker_gpu.so 庫中的 default_fail_func() 函數,但是 libdeflicker_gpu.so 是第三方動态庫,無法分析代碼,是以退一步到外層的調用代碼查找問題。

連結  libdeflicker_gpu.so 的動态庫是 com.arcsoft.node.deflickergpu.so,由自己封裝層代碼生成,從代碼查找到調用了 libdeflicker_gpu.so 的接口函數 ADF_Preview_Process_FD,crash的時候寄存器的值儲存了下來,上圖黃框所示。

②使用ndk objdump工具反彙編libdeflicker_gpu.so庫(注意32/64位庫的工具版本不同):

D:\Android\Sdk\ndk-bundle\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\aarch64-linux-android\bin\objdump.exe -d libdeflicker_gpu.so > objdump_libdeflicker.txt

從儲存的 objdump_libdeflicker.txt 文本中找到 ADF_Preview_Process_FD 函數:

可看到函數起始位址為 056188(十六進制),crash位址為 = 056188(十六進制) + 12(十進制) = 0x056194

接着分析dump 檔案可知,0056194處的指令是 stp    x29, x30, [sp,#176],即把一對值x29和x30放到SP+176的位址,從函數的入口取值就發生了crash,說明傳入的參數有問題,一般是指針為空或指向了非法記憶體導緻。

是以在調用層檢測傳入參數即可,比如是結構體,就把其中指針變量都列印出來确認一下是否有效。如果外層參數都沒問題,就說明第三方庫内部的bug,需要找提供庫的人進行排查。

技巧總結:先在crash彙編指令附近找特殊指令,如mla 乘加指令、64位乘法、移位等出現次數較少的指令,大緻定位下crash範圍,然後逐行分析彙編找到精确的c/c++代碼位置。

二、檢視動态庫符号表

(1)nm -D xxx.so

(2)readelf -s xxx.so