接著輸入” chmod 777 /data/local/tmp/android_server” 給android_server加上相應的權限。
接著輸入” /data/local/tmp/android_server”啟動android_server。
如下圖所示:
輸入”adb forward tcp:23946 tcp:23946”進行tcp端口轉發
命令,啟動所要調試的Activity。
app會彈出”Waitting for debugger”對話框,如下圖所示:
點擊”Debug options”按鈕,在”Suspend on process entry point”, ”Suspend on thread start/exit”, ”Suspend on library load/unload” 等選項的前面打上勾,如下圖所示:
點擊”ok”後會在以下對話框的hostname中填上”localhost”
在彈出的”Choose process to attach to”窗口中找到”com.example.testjniso”進程,選中該進程,然後點擊”ok”按鈕。
其中可以看到com.example.testjniso進程的端口為8700。
如下圖所示:
在ida彈出的”Add map”窗口中,壹律點擊”Cancle”按鈕。
點擊ida中的暫停調試按鈕,暫停當前的調試,如下圖所示:
右擊libTestJniSo.so文件,在彈出的框中點擊”Jump to module base”,跳轉到libTestJniSo.so文件的起始地址。
按下Alt+T,彈出查找對話框中輸入” Java_com_example_testjniso_MainActivity_helloFromJni” 如下圖所示:
點擊”ok”按鈕後,即可跳轉到 Java_com_example_testjniso_MainActivity_helloFromJni 函數所在的起始地址。
然後在地址處下斷點:
再按F9重新開始調試,點擊app中的”點擊加載so文件”按鈕重新加載libTestJniSo.so,即可看到程序成功地停在了斷點處:
到此處就可以正常地調試so文件了。
Linker是什麽?
Linker就是/system/lib/linker,它是進程啟動時第壹個加載的模塊,它負責管理elf可執行文件以及各個so文件的加載執行,還參與了調試的壹些東西。通俗地說,它是壹個elf文件的解釋器。它可以加載elf可執行文件及so動態庫。
在android 5.0下,不能執行android_server是因為android5.0自帶的linker不支持加載非pie的elf文件,但如果自己實現壹個可以加載pie的linker,不就可以解決這個問題了嗎?對的,就是醬紫,補上自己的自定義linker在附件.
/thread-206084.htm