文档章节

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

i
 i不歪
发布于 2016/04/06 16:43
字数 804
阅读 195
收藏 0
点赞 1
评论 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
博文 55
码字总数 51263
作品 0
西城
爱奇艺 xhook 1.1.5 发布,产品级的安卓 PLT hook 库

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

nomagic ⋅ 05/03 ⋅ 0

针对 Android 平台 ELF 的 PLT hook 库 - x-hook

oooo oooo 888 oooo ooo 888 .oo. .ooooo. .ooooo. 888 oooo 88b d88' `88b 888 .8P' Y888' 888 888 888 888 888 888 888888. .o8"'88b 888 8...

nomagic ⋅ 04/25 ⋅ 0

代码编译后移动目录引起gdb找不到代码文件

我们从一个最简单的C语言程序开始。源文件main.c在 用户目录gdb文件夹下。 florian@florian-pc:~/gdb$ cat main.c int main() { return 0; }; 然后将源文件编译为main(需要调试选项-g),并...

zhangyujsj ⋅ 2016/07/23 ⋅ 0

Android PLT hook 概述

  获取代码和资源   原文链接   开始 新的动态库   我们有一个新的动态库:libtest.so。      头文件 test.h      源文件 test.c      的功能是在终端打印出这6个字符(...

Android群英传 ⋅ 05/08 ⋅ 0

NDK调试之ndk-gdb

NDK包含了一个辅助脚本ndk-gdb使你能够轻松地为你的 由NDK产生的机器码 启动一个调试会话。 要求 想要调试本地层代码,你必须遵循如下的要求: 使用ndk-build脚本编译你的app。ndk-gdb脚本不...

WolfCS ⋅ 2015/11/07 ⋅ 0

[学习笔记][AndroidStudio] AS开发工具学习笔记

版本:v2.2 工欲善其事必先利其器,所以对工具的使用还是需要花点时间了解和掌握下的。 主要还是一些快捷键便于开发,另外还有些功能如连到Github,用Android Device Monitor调试,断点调试等...

kris_fei ⋅ 04/29 ⋅ 0

华为终端开放实验室Android P DP2 测试能力已上线!

北京时间5月9日 Android P DP2 发布,华为终端开放实验室 Pixel 手机已全面完成版本升级,并于今日上线了基于 Android P DP2 的兼容性测试和远程真机调试功能。 华为终端开放实验室已对 TOP3...

华为终端开放实验室 ⋅ 05/23 ⋅ 0

华为云测平台服务再升级!华为M5系列平板调测能力正式上线!

6月1日,华为M5系列平板设备兼容性测试和远程真机调试功能在华为终端开放实验室正式上线!助力您的产品在大屏适配上快人一步! 华为终端开放实验室DevEco平台现已提供基于华为M5系列平板设备...

华为终端开放实验室 ⋅ 06/08 ⋅ 0

SHC加密shell脚本

安装: # wget http://www.datsi.fi.upm.es/%7Efrosal/sources/shc-3.8.6.tgz # tar zvxf shc-3.8.6.tgz # cd shc-3.8.6 # make test # make strings # make install 应用: 下面以mysql数据库......

langtu329 ⋅ 2016/04/07 ⋅ 0

使用shc加密shell脚本

安装: # wgethttp://www.datsi.fi.upm.es/%7Efrosal/sources/shc-3.8.6.tgz # tar zvxf shc-3.8.6.tgz # cd shc-3.8.6 # make test # make strings # make install 应用: 下面以mysql数据库备......

鉴客 ⋅ 2012/02/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

IDEA PermGen space内存溢出

解决方案: File -> Settings -> Build, Execution, Deployment / Build Tools / Maven / Runner下,找到VM Options选项,默认是空的,改为如下内容(或更大值)...

快乐的小火柴 ⋅ 17分钟前 ⋅ 0

前端常见跨域解决方案

什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。 广义的跨域: 1.) 资源跳转: A链接、重定向、表单提交2.) 资源嵌入: <link>、<script>、<im...

临江仙卜算子 ⋅ 17分钟前 ⋅ 0

系统管理命令service

service命令用来控制系统服务的实用工具,例如启动、停止、重启和关闭系统服务,以及当前状态。当然也可以直接操作,例如/etc/init.d/mysqld restart等。 语法 service (选项)(参数) 选项...

Jpchina ⋅ 22分钟前 ⋅ 0

MySQL 联合索引的命中规则

为什么要用联合索引? 对于查询语句“SELECT T.* FROM T WHERE T.c1=1 AND T.c3=2”涉及到两列,这个时候我们一般采用一个联合索引(c1, c3);而不用两个单列索引,这是因为一条查询语句往往应...

hensemlee ⋅ 30分钟前 ⋅ 0

Spring 自动组件扫描

通常情况下都是在XML配置文件中手动声明Bean和组件的。不过Spring也可以自动扫描组件实例化Bean,这样就可以避免在XML文件中繁琐的Bean声明。 手动声明Bean: 这里不再啰嗦,就是简单地在XML...

霍淇滨 ⋅ 34分钟前 ⋅ 0

MapReduce简单需求分析-共同好友及查找互粉的情况

MapReduce的设计,最重要的是要找准key,然后制定一系列的数据处理流程。MapReduce的Map中,会把key相同的分配到同一个reduce中,对于key的选择,可以找到某个相同的因素。以下面的几个例子说...

Jason_typ ⋅ 36分钟前 ⋅ 0

springboot多数据源自动切换

SpringBoot多数据源切换,先上配置文件: 1.pom: <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20......

JackyRiver ⋅ 38分钟前 ⋅ 0

Boost库编译应用

版本:Boost 1.66.0 Windows库编译 官网指南:直接执行bootstrap.bat处理文件即可,可以我却遇到一堆的问题。 环境:Windows 10 + Visual Studio 2017 Boost编译出来库命名 boost库生成文件命...

水海云 ⋅ 43分钟前 ⋅ 0

解决Eclipse发布到Tomcat丢失依赖jar包的问题

如果jar文件是以外部依赖的形式导入的。Eclipse将web项目发布到Tomcat时,是不会自动发布这些依赖的。 可以通过Eclipse在项目上右击 - Propertics - Deployment Assembly,添加“Java Build ...

ArlenXu ⋅ 43分钟前 ⋅ 0

iview tree组件层级过多时可左右滚动

使用vue+iview的tree组件,iview官网iview的tree树形控件 问题描述:tree层级过多时左右不可滚动 问题解决:修改overflow属性值 .el-tree-node>.el-tree-node_children { overflow: vi...

YXMBetter ⋅ 45分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部