文档章节

GDB远程调试Android上的可执行ELF文件

i
 i不歪
发布于 2016/04/06 16:43
字数 804
阅读 218
收藏 0

GDB远程调试Android上的可执行ELF文件

@(Android研究)[android|gdb]


[TOC]


文章背景

现在需要将Linux上的工具移植到Android上,通常Linux上代码是通过Makefile管理编译选项,为了直接使用Makefile而不使用Android.mk文件,则需要使用Android NDK的编译工具链进行交叉编译,成功时会输出一个可在Android上运行的ELF可执行文件,在本文中假设这个ELF可执行文件名为"android-exe"。本文介绍如何在本机(本文中的本机系统是Linux)上通过GDB远程调试Android上的"android-exe"。

为何使用GDB调试

  1. Android NDK提供了一个ndk-gdb的脚本,该脚本只能调试通过Android.mk编译的本地代码。详情可参考:ndk-gdb
  2. 没有找到Android Studio或eclipse远程调试Android ELF可执行文件的方法。

前置说明

我的Android NDK的版本:android-ndk-r11b。

  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"。

步骤1、2是为了本机GDB远程调试时可以找到Android系统库的符号。

调试

1. 启动gdb server

在adb shell中进入"/data/local/tmp/"目录,然后执行下面的命令:

gdbserver :1234 android-exe

1234表示gdb监听的调试端口,android-exe是被调试的ELF可执行程序。

如果调试的程序需要传入参数,那么输入命令:gdbserver :1234 android-exe [参数...]

2. 重定向端口

在本机上输入下面的命令重定向端口:

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

© 著作权归作者所有

共有 人打赏支持
i
粉丝 5
博文 71
码字总数 62055
作品 0
西城
Android native debug: 手动使用gdbserver远程调试C代码

一般用java做一个Android app,里面夹杂着jni/*.c 所编译出来的lib,是可以通过gdb来调试的,也许大多数人都在按照网上各种帮助在使用,原理是比较古怪的:app里被塞进去一个gdbserver程序!...

Q_J
2015/06/19
0
0
针对 Android 平台 ELF 的 PLT hook 库 - xHook

概述 xhook 是一个针对 Android 平台 ELF (可执行文件和动态库) 的 PLT (Procedure Linkage Table) hook 库。 xhook 一直在稳定性和兼容性方面做着持续的优化。 特征 支持 Android 4.0 (含)...

caikelun
07/05
0
0
开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用

如何设置您的NDK应用 本篇主要介绍NDK应用的开发步骤,调试流程已经如何为英特尔架构设置您的NDK应用。 相关文章 •1. 开发兼容英特尔架构的Android应用(一) 应用架构介绍 •2. 开发兼容英特...

LiSteven
2013/08/07
0
0
Red/System 语言获得了OS X, ARM, Android 后端

红色/系统(Red/System),在Syllable项目使用的新式程序语言,有了下一个里程碑式的成果——其编译器的一个ARM代码生成器后端。该后端支持Android(见截图)和通用ARM Linux(Debian上的截图...

xyxzfj
2012/01/02
0
0
爱奇艺 xhook 1.1.5 发布,产品级的安卓 PLT hook 库

介绍 xhook 是一个针对 Android 平台 ELF (可执行文件和动态库) 的 PLT (Procedure Linkage Table) hook。 xhook 一直在稳定性和兼容性方面做着持续的优化。 特征 支持 Android 4.0 (含) 以上...

nomagic
05/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
1
0
LNMP架构(Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl)

Nginx负载均衡 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时...

蛋黄_Yolks
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部