`
MyEyeOfJava
  • 浏览: 1149376 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7af2d6ca-4fe1-3e9a-be85-3f65f7120bd0
测试开发
浏览量:71062
533896eb-dd7b-3cde-b4d3-cc1ce02c1c14
晨记
浏览量:0
社区版块
存档分类
最新评论

[android]使用jdb调试android应用程序

阅读更多
觉得eclipse太过臃肿,或者机器资源有限,不妨试试用jdb命令行中调试java程序。先要确保adb工作正常,用adb jdwp列出支持JDPW的进程ID。
835
$ adb jdwp:
876
873
879
926
956
989
999
1010
1022

用adb shell ps查看进程的信息。
system 835 793 208564 29768 ffffffff afe0c57c S system_server
radio 873 793 112816 21252 ffffffff afe0d674 S com.android.phone
app_8 876 793 98044 17336 ffffffff afe0d674 S android.process.media
app_7 879 793 123780 28452 ffffffff afe0d674 S android.process.acore
app_0 926 793 104916 18372 ffffffff afe0d674 S com.google.process.gapps
app_11 956 793 96008 16392 ffffffff afe0d674 S com.android.alarmclock
app_16 989 793 105304 16772 ffffffff afe0d674 S com.android.mms
app_23 999 793 96324 15552 ffffffff afe0d674 S org.broncho.powermonitor
app_19 1010 793 98492 16044 ffffffff afe0d674 S com.android.setupwizard
app_7 1022 793 106708 19204 ffffffff afe0d674 S com.android.inputmethod.pinyin


确定要调试的进程ID之后,建立网络数据转发关系。
假设这里要调试进程873。
adb forward tcp:9000 jdwp:873


设置jdb源代码路径,这里设置了android系统内的JAVA路径,如果调试自己的应用程序 ,可以加在后面。
export ANDROID_SRC=/broncho/cupcake/dev
export ANDROID_SRC_PATH=$ANDROID_SRC/frameworks/base/opengl/java:$ANDROID_SRC/frameworks/base/awt/java:$ANDROID_SRC/frameworks/base/core/java:$ANDROID_SRC/frameworks/base/location/java:$ANDROID_SRC/frameworks/base/sax/java:$ANDROID_SRC/frameworks/base/graphics/java:$ANDROID_SRC/frameworks/base/telephony/java:$ANDROID_SRC/frameworks/base/services/java:$ANDROID_SRC/frameworks/base/media/java:$ANDROID_SRC/frameworks/base/wifi/java:$ANDROID_SRC/frameworks/base/im/java:$ANDROID_SRC/dalvik/libcore/suncompat/src/main/java:$ANDROID_SRC/dalvik/libcore/nio_char/src/main/java:$ANDROID_SRC/dalvik/libcore/nio_char/src/main/java/java:$ANDROID_SRC/dalvik/libcore/security-kernel/src/main/java:$ANDROID_SRC/dalvik/libcore/security-kernel/src/main/java/java:$ANDROID_SRC/dalvik/libcore/security/src/main/java:$ANDROID_SRC/dalvik/libcore/security/src/main/java/java:$ANDROID_SRC/dalvik/libcore/archive/src/main/java:$ANDROID_SRC/dalvik/libcore/archive/src/main/java/java:$ANDROID_SRC/dalvik/libcore/awt-kernel/src/main/java:$ANDROID_SRC/dalvik/libcore/awt-kernel/src/main/java/java:$ANDROID_SRC/dalvik/libcore/luni/src/main/java:$ANDROID_SRC/dalvik/libcore/luni/src/main/java/java:$ANDROID_SRC/dalvik/libcore/math/src/main/java:$ANDROID_SRC/dalvik/libcore/math/src/main/java/java:$ANDROID_SRC/dalvik/libcore/x-net/src/main/java:$ANDROID_SRC/dalvik/libcore/openssl/src/main/java:$ANDROID_SRC/dalvik/libcore/dalvik/src/main/java:$ANDROID_SRC/dalvik/libcore/auth/src/main/java:$ANDROID_SRC/dalvik/libcore/concurrent/src/main/java:$ANDROID_SRC/dalvik/libcore/concurrent/src/main/java/java:$ANDROID_SRC/dalvik/libcore/sql/src/main/java:$ANDROID_SRC/dalvik/libcore/sql/src/main/java/java:$ANDROID_SRC/dalvik/libcore/prefs/src/main/java:$ANDROID_SRC/dalvik/libcore/prefs/src/main/java/java:$ANDROID_SRC/dalvik/libcore/xml/src/main/java:$ANDROID_SRC/dalvik/libcore/text/src/main/java:$ANDROID_SRC/dalvik/libcore/text/src/main/java/java:$ANDROID_SRC/dalvik/libcore/luni-kernel/src/main/java:$ANDROID_SRC/dalvik/libcore/luni-kernel/src/main/java/java:$ANDROID_SRC/dalvik/libcore/regex/src/main/java:$ANDROID_SRC/dalvik/libcore/regex/src/main/java/java:$ANDROID_SRC/dalvik/libcore/nio/src/main/java:$ANDROID_SRC/dalvik/libcore/nio/src/main/java/java:$ANDROID_SRC/dalvik/libcore/json/src/main/java:$ANDROID_SRC/dalvik/libcore/crypto/src/main/java:$ANDROID_SRC/dalvik/libcore/icu/src/main/java:$ANDROID_SRC/dalvik/libcore/annotation/src/main/java:$ANDROID_SRC/dalvik/libcore/annotation/src/main/java/java:$ANDROID_SRC/dalvik/libcore/junit/src/main/java:$ANDROID_SRC/dalvik/libcore/logging/src/main/java:$ANDROID_SRC/dalvik/libcore/logging/src/main/java/java:$ANDROID_SRC/dalvik/libcore-disabled/instrument/src/main/java:$ANDROID_SRC/dalvik/libcore-disabled/instrument/src/main/java/java:$ANDROID_SRC/dalvik/libcore-disabled/sound/src/main/java


启动jdb
jdb -sourcepath $ANDROID_SRC_PATH -attach localhost:9000


这里的端口号9000,是由前面的tcp:9000决定。然后就可以使用jdb的各种调试命令了。方便起见可以使用jdbshell。

附:
jdb/jdbshell基本调试技巧:

jdbshell兼容所有jdb命令,只是另外加了些命令缩写、记录历史、命令自动补全和命令行编辑等功能。

1.用threads查询所有线程:
命令:
threads

结果显示示例:
组 system:
(java.lang.Thread)0xc14360d1e8 <7> Signal Catcher 条件正在等待
(java.lang.Thread)0xc142850040 <5> HeapWorker 条件正在等待
组 main:
(java.lang.Thread)0xc140018e50 <3> main 条件正在等待
(java.lang.Thread)0xc143767c78 <59> Binder Thread #16 正在运行
(java.lang.Thread)0xc143744d48 <57> Binder Thread #15 正在运行
(java.lang.Thread)0xc143757458 <51> Binder Thread #14 正在运行
(java.lang.Thread)0xc14374ab88 <55> Binder Thread #13 正在运行
(java.lang.Thread)0xc14376d698 <53> Binder Thread #12 正在运行
(java.lang.Thread)0xc143615478 <45> Binder Thread #11 正在运行
(java.lang.Thread)0xc1437317b0 <49> Binder Thread #10 正在运行
(java.lang.Thread)0xc1436e8c38 <47> Binder Thread #9 正在运行
(java.lang.Thread)0xc14374eb50 <43> Binder Thread #8 正在运行
(java.lang.Thread)0xc1437000e0 <41> Binder Thread #7 正在运行
(android.os.HandlerThread)0xc1436dd9d0 <37> ContactsAsyncWorker 条件正在等待
(java.lang.Thread)0xc143681fb8 <35> Binder Thread #6 正在运行
(java.lang.Thread)0xc143681ef8 <33> Binder Thread #5 正在运行
(java.lang.Thread)0xc143659170 <31> Stk App Service 条件正在等待
(java.lang.Thread)0xc14368bc88 <29> Binder Thread #4 正在运行
(java.lang.Thread)0xc14368ad00 <27> Binder Thread #3 正在运行
(android.os.HandlerThread)0xc1436597a0 <25> AsyncQueryWorker 条件正在等待
(android.os.HandlerThread)0xc143656c00 <23> Stk Icon Loader 条件正在等待
(android.os.HandlerThread)0xc143656580 <21> RilMessageDecoder 条件正在等待
(android.os.HandlerThread)0xc1436560a0 <19> Stk Telephony service 条件正在等待
(java.lang.Thread)0xc143643c70 <17> RILReceiver 正在运行
(android.os.HandlerThread)0xc143641858 <15> RILSender 条件正在等待
(java.lang.Thread)0xc14360ee08 <13> Binder Thread #2 正在运行
(java.lang.Thread)0xc14360df90 <11> Binder Thread #1 正在运行


2.选择你感兴趣的线程。
命令:
thread 0xc1436dd9d0


结果显示示例:
<37> ContactsAsyncWorker[1]


和gdb不同的是,这里使用线程的ID,而不是线程的序号。这个问题让我折腾了好久,问了好几个做JAVA的朋友,原来他们都不用jdb。

3.暂停线程。
命令:
suspend 0xc1436dd9d0


4.显示调用堆栈。
命令:
wherei


结果显示示例:
[1] java.lang.Object.wait (本机方法)
[2] java.lang.Object.wait (Object.java:288), pc = 3
[3] android.os.MessageQueue.next (MessageQueue.java:148), pc = 153
[4] android.os.Looper.loop (Looper.java:110), pc = 8
[5] android.os.HandlerThread.run (HandlerThread.java:60), pc = 28

5.切换调用堆栈的frame:

命令:
up [n 帧] – 向上移动线程的堆栈
down [n 帧] – 向下移动线程的堆栈

和gdb不同的时,这里指定的是要切换的frame与当前frame的偏移,而不是frame的索引。

结果显示示例:
<37> ContactsAsyncWorker[1] up
<37> ContactsAsyncWorker[2]


6.设置断点

命令:
stop at <类>:<行号> 或
stop in <类>.<方法名>[(参数类型,...)]


结果显示示例:
> stop at com.android.phone.SimContacts$ImportAllThread:124
设置 断点 com.android.phone.SimContacts$ImportAllThread:124


7.显示某个类的信息。有时要在嵌套类里设置断点,这个命令可能有帮助。
命令:
class <类 ID> – 显示已命名的类的详细信息

结果显示示例:
>class com.android.phone.SimContacts
类:com.android.phone.SimContacts
扩展: com.android.phone.ADNList
嵌套: com.android.phone.SimContacts$ImportAllThread


8.继续运行
命令:
step – 执行当前行
step up – 执行到当前方法返回到其调用程序
stepi – 执行当前指令
next – 跳过一行(跨过调用)
cont – 从断点处继续执行


9.清除断点
命令:
clear <类 ID>.<方法>[(参数类型,...)] – 清除方法中的断点
clear <类 ID>:<行> – 清除行中的断点
clear – 列出断点


10.查看源代码
命令:
list [line number|method] – 输出源代码

11.jdbshell命令缩写
command alias:
c — cont
l — list
n — next
r — run
s — step
si — stepi
f — step up
bt — wherei
分享到:
评论

相关推荐

    JDB调试安卓应用程序测试应用

    本文将详细介绍如何使用JDB来调试Android应用程序,并结合提供的"JDBTest"示例,探讨其实际应用。 首先,了解JDB的基本用法。JDB可以通过adb(Android Debug Bridge)与设备或模拟器进行通信。要启动JDB调试,你...

    Android So动态调试之反jdb附加的解决大法

    然而,Android系统的安全性机制使得直接使用JDB(Java Debugger)进行远程附加调试变得困难重重。本文将深入探讨如何解决这一问题,以便更有效地进行Android So动态调试。 首先,我们需要理解JDB在Android中的工作...

    Android安卓安全加固反调试检测手段(java层+native层)(附代码实现).pdf

    当使用jdb进行动态调试连接时,如果连接成功,`android.os.Debug.isDebuggerConnected()`方法会返回true。为了防止这种情况,可以在反编译工具中搜索`isDebuggerConnected()`关键字,并将其调用处用Nop指令替换。...

    android so动态调试-测试专用apk

    在Android平台上,SO(Shared Object)文件是C/C++编写的动态链接库,它们为Java应用程序提供了底层功能和性能优化。动态调试SO文件是开发者排查问题、优化代码和理解底层工作原理的重要手段。本资源“android so...

    AndroidSo动态调试.zip

    2. ** Frida**:一个强大的动态代码插桩工具,可以注入JavaScript代码来修改应用程序的运行行为,实现对.so的动态调试。 3. **GDB (GNU Debugger)**:传统的C/C++调试器,可以通过其Android版本GDBserver与Frida...

    Android_Anti_Debug,android反调试的一个例子。.zip

    2. 反调试:反调试技术则是应用程序采取的一种自我保护机制,用来检测并可能阻止调试器的运行,防止恶意攻击者利用调试器分析和篡改应用逻辑。 二、Android_Anti_Debug项目详解 1. 检测调试器:项目主要通过检查...

    Android开发工具之jdk

    在Android开发中,JDK提供了构建应用程序所需的编译器和其他工具。Android Studio,作为官方推荐的集成开发环境(IDE),内置了基于JDK的工具链,包括Gradle构建系统,它使用Java编写的插件来管理项目依赖和构建过程。...

    jdb分析文档.pdf

    本案例通过使用 JDB 工具来调试一个名为 `com.example.demo` 的 Android 应用程序,目的是分析该应用中的 HTTP 发包行为以及 Android 与 JavaScript 的交互方式。 1. **运行 Demo 并打开终端**: - 使用命令 `adb ...

    android4.4源码 android-19源代码

    2. HAL(硬件抽象层):在Linux内核和上层应用程序之间提供硬件接口。 3. Android运行时(ART):取代了早期的Dalvik虚拟机,提供更快的应用执行速度和更好的资源管理。 4. Framework层:包含各种服务、库和API,如...

    电脑桌面操作Android手机界面工具

    此外,对于开发者而言,能够在电脑上直接调试Android应用,无需频繁地在手机和电脑之间切换,极大地提升了开发效率。 标签“Windows Android 操作”表明这个工具是在Windows操作系统环境下,用于Android设备的操作...

    android逆向菜鸟速参手册完蛋版

    - **Android模拟器配置以及ROOT**:配置并使用Android模拟器可以帮助开发者在不同的设备配置和操作系统版本上测试应用程序。同时,对于逆向工程师来说,获取模拟器的ROOT权限尤为重要,因为这允许他们访问系统的底层...

    ADB 1.0.32_adb1.0.32_adb_androidtools_android_

    2. **日志记录**:通过`logcat`命令,ADB能够捕获设备上的系统日志,这对于调试应用程序和分析错误非常有用。 3. **文件传输**:开发者可以使用ADB将文件推送到设备或从设备拉取文件,这对于部署应用、更新资源或者...

    android源码开发实战20.02.zip

    9. **调试技巧**:使用ADB(Android Debug Bridge)进行设备控制,用DDMS或Logcat监控日志,通过JDB或Android Studio进行远程调试,都是源码级调试的重要工具。 10. **系统服务**:例如Location服务、Notification...

    【android软件安全与逆向分析】完整扫描版

    1. **Android系统架构**:首先,我们需要理解Android系统的组件和工作原理,如Dalvik/ART虚拟机、Linux内核、Android应用程序框架以及权限管理系统。这些基础知识为后续的安全分析提供了基础。 2. **APK文件结构**...

    Android开发环境搭建教程

    Android SDK 包含了一系列工具和API,用于开发、测试和调试Android应用。访问Android Studio官方网站 (https://developer.android.com/studio) 或者直接下载独立的Android SDK Manager。安装过程中可以根据需要选择...

    Android.rar

    开发者使用JDK来编写、编译和调试Android应用。JDK 8是广泛使用的版本,它提供了Java运行环境(JRE)和一套开发工具,如javac编译器、javadoc文档生成器以及jdb调试器等。 其次,`SQLiteExpertPersSetup64.exe`是...

    android 源码修改

    - **调试**:使用Android的调试工具,如Logcat、DDMS、JDB等进行问题定位和调试。 - **提交与合并**:如果是在项目或社区环境中,需要将修改提交到版本控制系统(如Git),并申请代码审查和合并。 总的来说,...

    Java和Android官方文档

    1. **开发者指南**:引导开发者了解Android系统架构、用户界面设计、应用程序组件(Activity、Service、BroadcastReceiver、ContentProvider)、生命周期管理等基础知识。 2. **API参考**:列出所有可用的Android ...

    android 环境安装.docx

    在搭建Android开发环境的过程中,首先需要安装的是Java Development Kit(JDK)。JDK是由Oracle公司提供的,...每个环节都是为了创造一个高效且稳定的开发环境,使得开发者能够顺利地编写、测试和调试Android应用程序。

    Windows上Eclipse搭建Android开发环境教程

    * 安装 ADT 插件后,可以使用 Eclipse 开发 Android 应用程序。 本文指导读者在 Windows 平台上搭建 Android 开发环境,涵盖了 JDK 的安装、配置 Windows 上 JDK 的变量环境、下载安装 Eclipse、下载安装 Android ...

Global site tag (gtag.js) - Google Analytics