文档章节

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

i
 i不歪
发布于 2016/04/06 16:43
字数 804
阅读 291
收藏 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上使用qemu-user运行可执行文件

在Android上使用qemu-user运行可执行文件 作者:寻禹@阿里聚安全 前言 QEMU简要介绍: QEMU可以解释执行可执行程序。既然QEMU可以解释执行可执行程序,那么QEMU就能够知道执行了哪些指令,从...

阿里聚安全
2016/07/27
435
0
针对 Android 平台 ELF 的 PLT hook 库 - xHook

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

caikelun
07/05
0
0
使用 Swift 语言编写 Android 应用入门

Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。本文解释了如何在你的安卓手机上运行一个简单的“hello,world”程序。 如果你遇到了任何问题,请参考下...

oschina
2016/04/19
12.4K
27
Android native debug: 手动使用gdbserver远程调试C代码

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

Q_J
2015/06/19
0
0
AndroidLinker与SO加壳技术

Android 系统安全愈发重要,像传统pc安全的可执行文件加固一样,应用加固是Android系统安全中非常重要的一环。目前Android 应用加固可以分为dex加固和Native加固,Native 加固的保护对象为 ...

御安全
2016/11/18
321
0

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
5
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0
Kernel I2C子系统

备注:所有图片来源于网络 1,I2C协议: 物理拓扑: I2C总线由两根信号线组成,一条是时钟信号线SCL,一条是数据信号线SDA。一条I2C总线可以接多个设备,每个设备都接入I2C总线的SCL和SDA。I...

yepanl
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部