Android jdb debug

摘要:
在ubuntu上android的debug的方式有很多种,可以用eclipse,androidstudio。但是有的时候,为了方便也可以用命令行去debug。下面列出命令行debug的过程xxx:~$cdsource/xxx:~/source$cdpackages/apps/Settings/xx:~/source/packages/apps/Settings$adbshellps|grepcom.android.settingssystem311920255043638152ffffffff400dd888Scom.android.settingsxxx:~/source/packages/apps/Settings$adbforwardtcp:7777jdwp:3119xxx:~/source/packages/apps/Settings$lsAndroidManifest.xmlAndroid.mkCleanSpec.mkMODULE_LICENSE_APACHE2NOTICEproguard.flagsressrctestsxxx:~/source/packages/apps/Settings$jdb-sourcepathsrc-attachlocalhost:7777Setuncaughtjava.lang.ThrowableSetdeferreduncaughtjava.lang.ThrowableInitializingjdb...˃stopincom.android.settings.Settings.onCreateSetbreakpointcom.android.settings.Settings.onCreate˃Breakpointhit:"thread=main",com.android.settings.Settings.onCreate(),line=197bci=2197if{main[1]list193};194195@Override196protectedvoidonCreate{197=˃if{198getWindow().setUiOptions;199}200201mAuthenticatorHelper=newAuthenticatorHelper();202mAuthenticatorHelper.updateAuthDescriptions;main[1]next.....main[1]printmInLocalHeaderSwitchmInLocalHeaderSwitch=true.....以上,操作还是蛮简单的。—重复执行最后一个命令—将命令重复执行n次#—放弃(无操作)help(或?)—列出命令version—输出版本信息exit—退出调试器:带有程序包限定符的完整类名:带有前导或尾随通配符(‘*’)的类名:‘threads’命令中报告的线程编号:Java编程语言表达式。支持大多数常见语法。

在ubuntu上android的debug的方式有很多种,可以用eclipse,android studio。但是有的时候,为了方便也可以用命令行去debug。下面列出命令行debug的过程

xxx:~$ cd source/
xxx:~/source$ cd packages/apps/Settings/
xx:~/source/packages/apps/Settings$ adb shell ps | grep com.android.settings
system 3119 202 550436 38152 ffffffff 400dd888 S com.android.settings
xxx:~/source/packages/apps/Settings$ adb forward tcp:7777 jdwp:3119
xxx:~/source/packages/apps/Settings$ ls
AndroidManifest.xml Android.mk CleanSpec.mk MODULE_LICENSE_APACHE2 NOTICE proguard.flags res src tests
xxx:~/source/packages/apps/Settings$ jdb -sourcepath src -attach localhost:7777
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
> stop in com.android.settings.Settings.onCreate
Set breakpoint com.android.settings.Settings.onCreate
>
Breakpoint hit: "thread=<1> main", com.android.settings.Settings.onCreate(), line=197 bci=2
197 if (getIntent().hasExtra(EXTRA_UI_OPTIONS)) {

<1> main[1] list
193 };
194
195 @Override
196 protected void onCreate(Bundle savedInstanceState) {
197 => if (getIntent().hasExtra(EXTRA_UI_OPTIONS)) {
198 getWindow().setUiOptions(getIntent().getIntExtra(EXTRA_UI_OPTIONS, 0));
199 }
200
201 mAuthenticatorHelper = new AuthenticatorHelper();
202 mAuthenticatorHelper.updateAuthDescriptions(this);
<1> main[1]next

.....

<1> main[1] print mInLocalHeaderSwitch
mInLocalHeaderSwitch = true

.....

以上,操作还是蛮简单的。

附:** JDB命令列表 **

  • connectors — 列出此 VM 中可用的连接器和传输
  • run [class [args]] — 开始执行应用程序的主类
  • threads [threadgroup] — 列出线程
  • thread— 设置默认线程
  • suspend [thread id(s)] — 挂起线程 (默认值: all)
  • resume [thread id(s)] — 恢复线程 (默认值: all)
  • where [| all] — 转储线程的堆栈
  • wherei [| all]– 转储线程的堆栈, 以及 pc 信息
  • up [n frames] — 上移线程的堆栈
  • down [n frames] — 下移线程的堆栈
  • kill— 终止具有给定的异常错误对象的线程
  • interrupt— 中断线程
  • print— 输出表达式的值
  • dump— 输出所有对象信息
  • eval— 对表达式求值 (与 print 相同)
  • set=— 向字段/变量/数组元素分配新值
  • locals — 输出当前堆栈帧中的所有本地变量
  • classes — 列出当前已知的类
  • class— 显示已命名类的详细资料
  • methods— 列出类的方法
  • fields— 列出类的字段
  • threadgroups — 列出线程组
  • threadgroup— 设置当前线程组
  • stop in.[(argument_type,...)] — 在方法中设置断点
  • stop at:— 在行中设置断点
  • clear.[(argument_type,...)] — 清除方法中的断点
  • clear:— 清除行中的断点
  • clear — 列出断点
  • catch [uncaught|caught|all]|— 出现指定的异常错误时中断
  • ignore [uncaught|caught|all]|— 对于指定的异常错误, 取消 ‘catch’
  • watch [access|all].— 监视对字段的访问/修改
  • unwatch [access|all].— 停止监视对字段的访问/修改
  • trace [go] methods [thread] — 跟踪方法进入和退出。 — 除非指定 ‘go’, 否则挂起所有线程
  • trace [go] method exit | exits [thread] — 跟踪当前方法的退出, 或者所有方法的退出 — 除非指定 ‘go’, 否则挂起所有线程
  • untrace [methods] — 停止跟踪方法进入和/或退出
  • step — 执行当前行
  • step up — 一直执行, 直到当前方法返回到其调用方
  • stepi — 执行当前指令
  • 下一步 — 步进一行 (步过调用)
  • cont — 从断点处继续执行
  • list [line number|method] — 输出源代码
  • use (或 sourcepath) [source file path] — 显示或更改源路径
  • exclude [, ... | "none"] — 对于指定的类, 不报告步骤或方法事件
  • classpath — 从目标 VM 输出类路径信息
  • monitor— 每次程序停止时执行命令
  • monitor — 列出监视器
  • unmonitor <monitor#> — 删除监视器
  • read— 读取并执行命令文件
  • lock— 输出对象的锁信息
  • threadlocks [thread id] — 输出线程的锁信息
  • pop — 通过当前帧出栈, 且包含当前帧
  • reenter — 与 pop 相同, 但重新进入当前帧
  • redefine— 重新定义类的代码
  • disablegc— 禁止对象的垃圾收集
  • enablegc— 允许对象的垃圾收集
  • !! — 重复执行最后一个命令
  • — 将命令重复执行 n 次
  • # <command>— 放弃 (无操作)
  • help (或 ?) — 列出命令
  • version — 输出版本信息
  • exit (或 quit) — 退出调试器
  • : 带有程序包限定符的完整类名
  • : 带有前导或尾随通配符 (‘*’) 的类名
  • : ‘threads’ 命令中报告的线程编号
  • : Java(TM) 编程语言表达式。
  • 支持大多数常见语法。

参考:

http://codeseekah.com/2012/02/16/command-line-android-development-debugging/

http://resources.infosecinstitute.com/android-hacking-security-part-5-debugging-java-applications-using-jdb/

免责声明:文章转载自《Android jdb debug》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇时间不同步导致的nova,cinder服务一会up一会down的来回跳跃设计模式C++学习笔记之十九(State状态模式)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

第45章:TLS回调函数

TLS(Thread Local Storage,线程局部存储)回调函数(Callback Function)常用于反调试。 TLS 回调函数的调用运行要先于 EP 代码的执行。它是各线程独立的数据存储空间,可修改进程的全局/静态数据。 若在编程中启用了 TLS,PE 头文件中会设置 TLS 项目,即:IMAGE_TLS_Directory 其中比较重要...

Unity C#笔记 协程详解(转)

目录 什么是协程 多线程 协程 协程的使用场景 协程使用示例 Invoke的缺陷 协程语法 开启协程 终止协程 挂起 协程的执行原理 什么是协程 在Unity中,协程(Coroutines)的形式是我最喜欢的功能之一,我都会使用它来控制需要定时的。 协同程序,在主程序运行的同时,开启另外一段逻辑处理,来协同当前程序的执行。 可能看了...

Debug技巧

多线程调试 有些时候为了观察多个线程间变量的不同状态,以及锁的获取等,就会想到在代码里加个断点debug一下。  在IDE里断点停下来的时候,可以切换到另外的线程中,跑其他的代码,不会互相影响。这里是有个开关的,在Eclipse里默认开启, 在IntelliJ IDEA里默认是没有开启的。也就是说如果你在IDEA里代码里加断点,虽然一个线程的断了下来,但其...

Qt --- 信号槽:第五个参数

connect第五个参数说明: 1、Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。 2、Qt::DirectConnection:槽函数会在...

黑马程序员——JAVA学习笔记六(多线程)

1,    什么是多线程?一个程序可以执行多个任务,每一个任务称为一个线程,运行多个线程的程序称为多线程程序。 进程:正在进行中的程序(直译)。 线程:进程中一个负责程序执行的控制单元(执行路径)。   多线程的好处:解决了多部分代码同时运行的问题。多线程的弊端:线程太多,会导致效率的降低。 其实,多个应用程序同时执行都是CPU在做着快速的切换完成的。这个...

Go语言的调度模型(GPM)

GPM模型 定义于src/runtime/runtime2.go G: Gourtines(携带任务), 每个Goroutine对应一个G结构体,G保存Goroutine的运行堆栈,即并发任务状态。G并非执行体,每个G需要绑定到P才能被调度执行。 P: Processors(分配任务), 对G来说,P相当于CPU核,G只有绑定到P(在P的local ru...