- 浏览: 1149376 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
MyEyeOfJava:
产生问题的主要原因:1.方洪波与南枫公司的直接主管李琼在合作共 ...
人力资源管理案例-左右为难的经理 -
吾名长弓:
学习了,作为一个管理新手,从文章里学到了很多东西,感谢 ...
2018新年管理感言 -
MyEyeOfJava:
非常不错,看过很多文章,说到管理者必然不能抛弃技术,我的主张是 ...
IT行业技术部门人员架构设计 -
小灯笼:
JMeter测试从入门到精通网盘地址:https://pan. ...
LR与Jmeter相关资料 -
flying6071:
“(2)CERT.SF:这是对摘要的签名文件。对前一步生成的M ...
Android签名与认证详细分析之一(CERT.RSA剖析)
觉得eclipse太过臃肿,或者机器资源有限,不妨试试用jdb命令行中调试java程序。先要确保adb工作正常,用adb jdwp列出支持JDPW的进程ID。
用adb shell ps查看进程的信息。
确定要调试的进程ID之后,建立网络数据转发关系。
假设这里要调试进程873。
设置jdb源代码路径,这里设置了android系统内的JAVA路径,如果调试自己的应用程序 ,可以加在后面。
启动jdb
这里的端口号9000,是由前面的tcp:9000决定。然后就可以使用jdb的各种调试命令了。方便起见可以使用jdbshell。
附:
jdb/jdbshell基本调试技巧:
jdbshell兼容所有jdb命令,只是另外加了些命令缩写、记录历史、命令自动补全和命令行编辑等功能。
1.用threads查询所有线程:
命令:
结果显示示例:
2.选择你感兴趣的线程。
命令:
结果显示示例:
和gdb不同的是,这里使用线程的ID,而不是线程的序号。这个问题让我折腾了好久,问了好几个做JAVA的朋友,原来他们都不用jdb。
3.暂停线程。
命令:
4.显示调用堆栈。
命令:
结果显示示例:
5.切换调用堆栈的frame:
命令:
up [n 帧] – 向上移动线程的堆栈
down [n 帧] – 向下移动线程的堆栈
和gdb不同的时,这里指定的是要切换的frame与当前frame的偏移,而不是frame的索引。
结果显示示例:
6.设置断点
命令:
结果显示示例:
7.显示某个类的信息。有时要在嵌套类里设置断点,这个命令可能有帮助。
命令:
class <类 ID> – 显示已命名的类的详细信息
结果显示示例:
8.继续运行
命令:
9.清除断点
命令:
10.查看源代码
命令:
list [line number|method] – 输出源代码
11.jdbshell命令缩写
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
- jdbshell.tar.gz (2.8 KB)
- 下载次数: 20
发表评论
-
[ATC]Facebook开源弱网模拟工具
2016-03-26 14:24 2699需要注意如下:1.笔者使用了linux USB网卡,是让 ... -
【远程真机管理】openstf
2016-03-24 11:36 2925网站地址:https://github.com/ope ... -
AndroidStudio性能优化
2016-03-15 16:39 1143Android Studio慢、吃内存!启动时后会立即通过Gr ... -
Drozer使用手册
2016-01-18 15:22 2223Drozer ⼯具的安装与启动:源码地址(https:// ... -
TCPDUMP抓包
2015-12-17 20:56 776tcpdump 使用方法:唯有使用文章描述的参数移动手机的 ... -
HTML5安全
2015-10-30 19:43 1319移动安全问题汇总:htt ... -
Android插件DSL配置文档
2015-07-29 15:54 1024Android Plugin DSL Reference -
Gradle-Android打包文档
2015-07-29 15:29 1817http://tools.android.com/tech- ... -
Android性能优化典范(一)
2015-06-02 17:26 13122015年伊始,Google发布 ... -
Android性能系列-电量篇
2015-05-29 16:28 1341电量篇 1) Understanding Battery ... -
Android性能系列-内存篇
2015-05-29 16:27 822内存篇 1) Memory, GC, and Perfor ... -
Android性能系列-运算篇
2015-05-29 16:26 578运算篇 1) Intro to Compute ... -
Android性能系列-渲染篇
2015-05-29 16:25 833Google近期在Udacity上发布了Android性能优 ... -
如何通过wifi在android手机上安装调试应用
2015-05-29 14:42 6981. 首先还是要打开手机 ... -
[Android]解决android65K方法引用限制
2015-01-14 11:39 1621解决方案如下: 1.Google官方的andr ... -
[Android]获取整体APP CPU信息
2015-01-07 14:34 4784通过proc获取CPU信息。adb shell cat / ... -
genymotion-安卓模拟器-IMEI修改方法
2015-01-05 15:44 4414看淘宝动辄就几十元卖这么个破玩意儿,实在是懒得说什么了,人总 ... -
[android]创建固定大小文件
2014-12-29 19:27 2205dd if=/dev/zero of=yourfile ... -
[总结]无线测试
2014-12-18 16:33 1141本文主要介绍测试在项目的各个阶段应该要做的事情、使用的工具和 ... -
[适配性]移动Webapp自适应方案
2014-12-18 16:15 1867此次方案的优化点 页面元素会随宽度的变化而自适应的放大 ...
相关推荐
本文将详细介绍如何使用JDB来调试Android应用程序,并结合提供的"JDBTest"示例,探讨其实际应用。 首先,了解JDB的基本用法。JDB可以通过adb(Android Debug Bridge)与设备或模拟器进行通信。要启动JDB调试,你...
然而,Android系统的安全性机制使得直接使用JDB(Java Debugger)进行远程附加调试变得困难重重。本文将深入探讨如何解决这一问题,以便更有效地进行Android So动态调试。 首先,我们需要理解JDB在Android中的工作...
当使用jdb进行动态调试连接时,如果连接成功,`android.os.Debug.isDebuggerConnected()`方法会返回true。为了防止这种情况,可以在反编译工具中搜索`isDebuggerConnected()`关键字,并将其调用处用Nop指令替换。...
在Android平台上,SO(Shared Object)文件是C/C++编写的动态链接库,它们为Java应用程序提供了底层功能和性能优化。动态调试SO文件是开发者排查问题、优化代码和理解底层工作原理的重要手段。本资源“android so...
2. ** Frida**:一个强大的动态代码插桩工具,可以注入JavaScript代码来修改应用程序的运行行为,实现对.so的动态调试。 3. **GDB (GNU Debugger)**:传统的C/C++调试器,可以通过其Android版本GDBserver与Frida...
2. 反调试:反调试技术则是应用程序采取的一种自我保护机制,用来检测并可能阻止调试器的运行,防止恶意攻击者利用调试器分析和篡改应用逻辑。 二、Android_Anti_Debug项目详解 1. 检测调试器:项目主要通过检查...
在Android开发中,JDK提供了构建应用程序所需的编译器和其他工具。Android Studio,作为官方推荐的集成开发环境(IDE),内置了基于JDK的工具链,包括Gradle构建系统,它使用Java编写的插件来管理项目依赖和构建过程。...
本案例通过使用 JDB 工具来调试一个名为 `com.example.demo` 的 Android 应用程序,目的是分析该应用中的 HTTP 发包行为以及 Android 与 JavaScript 的交互方式。 1. **运行 Demo 并打开终端**: - 使用命令 `adb ...
2. HAL(硬件抽象层):在Linux内核和上层应用程序之间提供硬件接口。 3. Android运行时(ART):取代了早期的Dalvik虚拟机,提供更快的应用执行速度和更好的资源管理。 4. Framework层:包含各种服务、库和API,如...
此外,对于开发者而言,能够在电脑上直接调试Android应用,无需频繁地在手机和电脑之间切换,极大地提升了开发效率。 标签“Windows Android 操作”表明这个工具是在Windows操作系统环境下,用于Android设备的操作...
- **Android模拟器配置以及ROOT**:配置并使用Android模拟器可以帮助开发者在不同的设备配置和操作系统版本上测试应用程序。同时,对于逆向工程师来说,获取模拟器的ROOT权限尤为重要,因为这允许他们访问系统的底层...
2. **日志记录**:通过`logcat`命令,ADB能够捕获设备上的系统日志,这对于调试应用程序和分析错误非常有用。 3. **文件传输**:开发者可以使用ADB将文件推送到设备或从设备拉取文件,这对于部署应用、更新资源或者...
9. **调试技巧**:使用ADB(Android Debug Bridge)进行设备控制,用DDMS或Logcat监控日志,通过JDB或Android Studio进行远程调试,都是源码级调试的重要工具。 10. **系统服务**:例如Location服务、Notification...
1. **Android系统架构**:首先,我们需要理解Android系统的组件和工作原理,如Dalvik/ART虚拟机、Linux内核、Android应用程序框架以及权限管理系统。这些基础知识为后续的安全分析提供了基础。 2. **APK文件结构**...
Android SDK 包含了一系列工具和API,用于开发、测试和调试Android应用。访问Android Studio官方网站 (https://developer.android.com/studio) 或者直接下载独立的Android SDK Manager。安装过程中可以根据需要选择...
开发者使用JDK来编写、编译和调试Android应用。JDK 8是广泛使用的版本,它提供了Java运行环境(JRE)和一套开发工具,如javac编译器、javadoc文档生成器以及jdb调试器等。 其次,`SQLiteExpertPersSetup64.exe`是...
- **调试**:使用Android的调试工具,如Logcat、DDMS、JDB等进行问题定位和调试。 - **提交与合并**:如果是在项目或社区环境中,需要将修改提交到版本控制系统(如Git),并申请代码审查和合并。 总的来说,...
1. **开发者指南**:引导开发者了解Android系统架构、用户界面设计、应用程序组件(Activity、Service、BroadcastReceiver、ContentProvider)、生命周期管理等基础知识。 2. **API参考**:列出所有可用的Android ...
在搭建Android开发环境的过程中,首先需要安装的是Java Development Kit(JDK)。JDK是由Oracle公司提供的,...每个环节都是为了创造一个高效且稳定的开发环境,使得开发者能够顺利地编写、测试和调试Android应用程序。
* 安装 ADT 插件后,可以使用 Eclipse 开发 Android 应用程序。 本文指导读者在 Windows 平台上搭建 Android 开发环境,涵盖了 JDK 的安装、配置 Windows 上 JDK 的变量环境、下载安装 Eclipse、下载安装 Android ...