文档章节

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

i
 i不歪
发布于 2016/04/06 16:43
字数 804
阅读 255
收藏 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
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
开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用

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

LiSteven
2013/08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

smart-doc特殊功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
0
0
JavaEE——Junit

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Junit Junit又名单元测试,Junit是用来测试Jav...

凯哥学堂
昨天
0
0
读《美丽新世界》

一、背景 十一国庆节从重庆回深圳的时候,做得绿皮车,路上看了两本书:李笑来的《韭菜的自我修养》和禁书《美丽新世界》。 上篇文章已经分享了 读《韭菜的自我修养》,这篇文章来记录一下《...

tiankonguse
昨天
0
0
archlinux下基于Jenkins,docker实现自动化部署(持续交互)

本文永久更新地址:https://my.oschina.net/bysu/blog/2250954 【若要到岸,请摇船:开源中国 不最醉不龟归】 -----------------------------------第一部分Jenkins的安装与使用-----------...

不最醉不龟归
昨天
0
0
Spark Parquet file split

在实际使用 spark + parquet 的时候, 遇到了两个不解的地方: 我们只有一个 parquet 文件(小于 hdfs block size), 但是 spark 在某个 stage 生成了4个 tasks 来处理. 4个 tasks 中只有一个 ta...

Aaaaaaaron
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部