文档章节

使用 GDB 调试 Android 应用

WolfCS
 WolfCS
发布于 2017/09/12 15:26
字数 1107
阅读 50
收藏 0
点赞 0
评论 0

GNU 工程调试器(GDB)是一个常用的 Unix 调试器。本文详述使用 gdb 调试 Android 应用和进程的方法。

调试运行中的应用或进程

gdbclient 是源码库中的一个 shell 脚本调试工具,它位于 android-7.1.1_r22/development/scripts/gdbclient。该脚本将根据 Android 源码库的根目录,设置端口转发,在设备上启动适当的 gdbserver,在主机上启动适当的 gdb,配置 gdb 查找符号,并将 gdb 连接到远程的 gdbserver

在执行 gdbclient 首先需要设置 ANDROID_BUILD_TOP 环境变量,这个环境变量可以手动设置,如:

/media/data/Androids/android-7.1.1_r22$ export ANDROID_BUILD_TOP=/media/data/Androids/android-7.1.1_r22

也可以通过如下命令设置:

/media/data/Androids/android-7.1.1_r22$ source build/envsetup.sh 
including device/asus/fugu/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-mips64/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/google/dragon/vendorsetup.sh
including device/google/marlin/vendorsetup.sh
including device/htc/flounder/vendorsetup.sh
including device/huawei/angler/vendorsetup.sh
including device/lge/bullhead/vendorsetup.sh
including device/linaro/hikey/vendorsetup.sh
including device/moto/shamu/vendorsetup.sh
including sdk/bash_completion/adb.bash
hanpfei0306@ThundeRobot:/media/data/Androids/android-7.1.1_r22$ lunch 18

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=7.1.1
TARGET_PRODUCT=aosp_sailfish
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv7-a-neon
TARGET_2ND_CPU_VARIANT=krait
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.4.0-89-generic-x86_64-with-Ubuntu-16.04-xenial
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=NMF26X
OUT_DIR=out
============================================

也就是 Android 源码库编译前配置。

如果没有设置 ANDROID_BUILD_TOP 环境变量的话,在执行 gdbclient 时将报出如下的错误:

/media/data/Androids/android-7.1.1_r22$ development/scripts/gdbclient
$ANDROID_BUILD_TOP is not set. Source build/envsetup.sh.

有了前面的那些配置,即可使用 gdbclient 调试 Android 应用程序了。要连接一个已经在运行的应用或本地层守护进程,则以 PID 作为参数执行 gdbclient。比如,要调试 PID 为 1234 的进程,则运行:

$ gdbclient 1234

它会为我们准备一切。

调试本地进程启动

要调试进程的启动,则使用 gdbservergdbserver64 (64 位进程)。比如:

$ adb shell gdbserver64 :5039 /system/bin/screenrecord

示例输出如下:

Process /system/bin/screenrecord created; pid = 12571
Listening on port 5039

接着,从 gdbserver 的输出中得到应用程序的 PID,并在另一个终端窗口中使用如下命令:

$ gdbclient 12571

最后,在 gdb 提示符下键入 continue

使用的 gdbserver 与实际运行的应用程序格式不匹配时,在执行 gdbclient 时将报出如下的错误:

$ gdbclient 12484
including device/asus/fugu/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-mips64/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/google/dragon/vendorsetup.sh
including device/google/marlin/vendorsetup.sh
including device/htc/flounder/vendorsetup.sh
including device/huawei/angler/vendorsetup.sh
including device/lge/bullhead/vendorsetup.sh
including device/linaro/hikey/vendorsetup.sh
including device/moto/shamu/vendorsetup.sh
including sdk/bash_completion/adb.bash

It looks like gdbserver is already attached to 12484 (process is traced), trying to connect to it using local port=5039
GNU gdb (GDB) 7.11
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from out/target/product/sailfish/symbols/system/bin/screenrecord...done.
warning: Selected architecture aarch64 is not compatible with reported target architecture arm
out/target/product/sailfish/gdbclient.cmds:4: Error in sourced command file:
Reply contains invalid hex digit 59
(gdb) break main
Breakpoint 1 at 0x5820: file frameworks/av/cmds/screenrecord/screenrecord.cpp, line 900.
(gdb) r
Starting program: /media/data/Androids/android-7.1.1_r22/out/target/product/sailfish/symbols/system/bin/screenrecord 
/usr/local/google/buildbot/src/android/master-ndk/toolchain/gdb/gdb-7.11/gdb/regcache.c:1056: internal-error: regcache_raw_supply: Assertion `regnum >= 0 && regnum < regcache->descr->nr_raw_registers' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n) y

This is a bug, please report it.  For instructions, see:
<http://www.gnu.org/software/gdb/bugs/>.

/usr/local/google/buildbot/src/android/master-ndk/toolchain/gdb/gdb-7.11/gdb/regcache.c:1056: internal-error: regcache_raw_supply: Assertion `regnum >= 0 && regnum < regcache->descr->nr_raw_registers' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Create a core file of GDB? (y or n) y
/media/data/Androids/android-7.1.1_r22/prebuilts/gdb/linux-x86/bin/gdb: 行 3: 12882 已放弃               (核心已转储) PYTHONHOME="$GDBDIR/.." "$GDBDIR/gdb-orig" "$@"
hanpfei0306@ThundeRobot:/media/data/Androids/android-7.1.1_r22$ /bin/bash: /media/data/Androids/android-7.1.1_r22/out/target/product/sailfish/symbols/system/bin/screenrecord: cannot execute binary file: 可执行文件格式错误
/bin/bash: /media/data/Androids/android-7.1.1_r22/out/target/product/sailfish/symbols/system/bin/screenrecord: 成功

即我们在 gdb 的提示符下输入 continue 执行应用程序之后,报出了 可执行文件格式错误

Done.

© 著作权归作者所有

共有 人打赏支持
WolfCS
粉丝 79
博文 147
码字总数 505099
作品 4
杭州
高级程序员
开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用

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

LiSteven
2013/08/07
0
0
Android native debug: 手动使用gdbserver远程调试C代码

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

Q_J
2015/06/19
0
0
Android NDK开发轻松入门

简介: AndroidNDK是能使Android应用开发者把从c/c++编译而来的本地代码嵌入到应用包中的一系列工具的组合。 注意: AndroidNDK只能用于Android1.5及以上版本中。 I. Android NDK 目标: Andro...

晨曦之光
2012/03/12
0
0
Android NDK开发轻松入门

简介: AndroidNDK是能使Android应用开发者把从c/c++编译而来的本地代码嵌入到应用包中的一系列工具的组合。 注意: AndroidNDK只能用于Android1.5及以上版本中。 I. Android NDK 目标: Andro...

晨曦之光
2012/03/12
0
0
linux 下 android ndk-gdb 调试 jni 中的c 代码

ndk-gdb 调试方法: 1 androidManifast.xml 中设置 android:debuggable="true" 2 eclipse 启动调试,并在调用 jni 代码行打断点,等待 3 Android 中操作,直到 eclipse 中断点, 4 eclipse ...

韩工
2012/04/26
0
0
android NDK开发、编译、调试环境搭建与操作入门

前话 现在越来越多的应用开发、场景会用到NDK,NDK的开发环境和工具也可谓是“日新月异”,Googleg还是比较给力,时至今日ADT已经发布了21.0.1,实际上从20.0.3已经对我们需要使用的NDK有了比...

带梦想一7飞
2013/10/14
0
0
[Android]关于Native函数的debug

先占坑,有空发。 环境:WIN7 + eclipse + android sdk4.3 + ndk r9b 需求:安卓程序通过jni调用C代码,并对C代码进行debug。 纠结:1、使用真机,直接无法启动 2、使用模拟器,能够启动,但...

ouczxl
2014/04/24
0
0
android JNI开发(1)--搭建cygwin环境

1.什么是cygwin? 百度百科:http://baike.baidu.com/view/3968.htm 2.什么是android ndk? Android NDK 即Native Development Kit,因此又被称为“NDK”。 在此之前,Android平台的第三方应...

大凉龙雀
2013/01/18
0
0
云图信安(成都)科技有限公司招聘

  公司介绍   云图信安(成都)科技有限公司是一家以互联网平台运营、WEB应用开发、软件开发、大数据分析、移动互联网通讯技术、云计算、营销推广、技术培训等技术为核心的科技公司。公司...

FreeBuf
06/13
0
0
Andrid SDK tools 目录下的工具介绍

Andrid SDK tools 目录下的工具介绍 Android SDK包含了各种各样的定制工具,简介如下: Android模拟器(Android Emulator ) 它是在你的计算机上运行的一个虚拟移动设备。你可以使用模拟器来...

流云的博客
2015/02/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

并发设计之A系统调用B系统

A-->B A在发送请求之前,用乐观锁,减少对B的重复调用,这样一定程度上是幂等性。 比如A系统支付功能,要调用B系统进行支付操作,但是前端对"支付"按钮不进行控制,即用户会不断多次点击支付...

汉斯-冯-拉特
9分钟前
0
0
HTTP协议通信原理

了解HTTP HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则。计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务。 HTTP使用...

寰宇01
32分钟前
0
0
【Java动态性】之反射机制

一、Java反射机制简介

谢余峰
32分钟前
1
0
Centos 6.X 部署环境搭建

1.Linux学习笔记CentOS 6.5(一)--CentOS 6.5安装过程

IT追寻者
46分钟前
0
0
博客即同步至腾讯云+社区声明

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=8vy9bsmadbko...

xiaoge2016
48分钟前
0
0
大数据教程(3.1):Linux系统搭建网络YUM源服务器

博主在前面的2.5章节讲述了linux系统本地YUM服务器的搭建和httpd轻量级静态网站服务器的安装,本节博主将为大家分享内网环境中搭建自己的网络YUM服务器的全过程。如果大家对本地YUM服务器还不...

em_aaron
52分钟前
0
0
蚂蚁技术专家:一篇文章带你学习分布式事务

小蚂蚁说: 分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在这几年越来越火的微服务架构中,几乎可以说是无法避免,本文就围绕分布式事务...

Java大蜗牛
53分钟前
0
0
新的Steam应用将拓展服务项目

导读 未来几周,Steam将推出两个免费的应用程序Steam Link和Steam Video。这两个应用程序都旨在拓展Steam平台的业务和便利性。 即将开放的Steam Link应用程序最先提供了Android测试版,它将允...

问题终结者
54分钟前
0
0
golang 第三方包的使用总结

golang 第三方包的安装的方法: 1. go get 安装 $ go get github.com/gin-gonic/gin 注意:执行go get 命令需要先安装git命令,并配置git全局变量。 2. 源码包安装 由于国内网络问题,很多时...

科陆李明
今天
1
0
Android Studio调试运行时ADB not responding

最近有我朋友问我一个android studio的调试运行问题,我记得以前也是遇到过得,所以 来写一下 ADB not responding.If you'd like to retry, then please manually kill "adb.exe" and click...

切切歆语
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部