GDB遠程調試Android上的可執行ELF文件

GDB遠程調試Android上的可執行ELF文件

@(Android研究)[android|gdb]html


[TOC]linux


文章背景

如今須要將Linux上的工具移植到Android上,一般Linux上代碼是經過Makefile管理編譯選項,爲了直接使用Makefile而不使用Android.mk文件,則須要使用Android NDK的編譯工具鏈進行交叉編譯,成功時會輸出一個可在Android上運行的ELF可執行文件,在本文中假設這個ELF可執行文件名爲"android-exe"。本文介紹如何在本機(本文中的本機系統是Linux)上經過GDB遠程調試Android上的"android-exe"。android

爲什麼使用GDB調試

  1. Android NDK提供了一個ndk-gdb的腳本,該腳本只能調試經過Android.mk編譯的本地代碼。詳情可參考:ndk-gdb
  2. 沒有找到Android Studio或eclipse遠程調試Android ELF可執行文件的方法。

前置說明

個人Android NDK的版本:android-ndk-r11b。shell

  1. 將Android設備上"/system/lib"目錄下的全部文件經過adb pull所有拉取到本機上。給本機上保存這些文件的目錄取一個別名:$SYSTEM_LIB。
  2. 將Android設備上"/system/bin"目錄下的全部文件經過adb pull所有拉取到本機上。給本機上保存這些文件的目錄取一個別名:$SYSTEM_BIN。(目前只有/system/bin/linker這個文件有用)
  3. 設,Android NDK工具鏈編譯代碼時所選取的Android平臺爲android-21,那麼該平臺庫對應的目錄是:$NDK/platforms/android-21/arch-arm/usr/lib/,給該目錄取一個別名:$PLATFORMS_21_LIB。
  4. Android NDK的gdb路徑:$NDK/prebuilt/linux-x86_64/bin/gdb。
  5. 我使用的是CyanogenMod的Android ROM,該ROM中自帶gdbserver。
  6. 設,"android-exe"在Android上的完整路徑是"/data/local/tmp/android-exe"。

步驟一、2是爲了本機GDB遠程調試時能夠找到Android系統庫的符號。eclipse

調試

1. 啓動gdb server

在adb shell中進入"/data/local/tmp/"目錄,而後執行下面的命令:tcp

gdbserver :1234 android-exe

1234表示gdb監聽的調試端口,android-exe是被調試的ELF可執行程序。ide

若是調試的程序須要傳入參數,那麼輸入命令:gdbserver :1234 android-exe [參數...]工具

2. 重定向端口

在本機上輸入下面的命令重定向端口:ui

adb forward tcp:1234 tcp:1234

3. GDB調試

輸入下面的命令進行調試命令行

$NDK/prebuilt/linux-x86_64/bin/gdb android-exe

這裏的"android-exe"是指本機上android-exe的存儲位置。

執行上面的命令後將會進入GDB命令行界面:

(gdb)

在GDB命令行界面中遠程鏈接gdbserver

target remote :1234

1234表明端口號。

在GDB命令行界面中設置庫搜索路徑

set solib-search-path $SYSTEM_LIB:$SYSTEM_BIN:$PLATFORMS_21_LIB

這一步是爲了本機上GDB遠程調試時能夠找獲得符號。

GDB經常使用命令

查看寄存器

info reg

設置和查看斷點

設置:

b <符號名>
b <文件路徑>:行號

查看:

info break

一次性斷點

tb <符號名>

繼續執行

c

單步跟蹤

n

步入

s

打印變量值

print <變量名>

print也能夠打印指針值:print *<指針變量名>。

查看當前執行位置

where
相關文章
相關標籤/搜索