1. 工程上的JDB是什么
JDB:就是无油滑动轴承、石墨铜套的简称。是在高力黄铜的基体上,镶嵌石墨或MoS2固体润滑剂的一高性能固体润滑产品。它突破了一般轴承依靠油膜润滑的局限性。在使用过程中,通过摩擦热使固体润滑剂与轴摩擦,形成油、粉末并存润滑的优异条件,既保护轴不磨损,又使固体润滑特性永恒。它的硬度比一般铜套高一倍,耐磨性能也高一倍。目前已广泛运用于冶金连铸机,列车支架、轧钢设备、起重机械、模具导套、矿山机械、船舶、轮机等高温、高载、低速重载等场合使用。
JDB是基于文本和命令行的调试工具(例如Sun JDB);虽然现在有一些很好的调试工具,然而 java 调试器 (JDB) 提供了一些优点。最重要的是 JDB 可以免费获取并且是平台独立的。其缺点是它只有命令行格式,一些开发人员认为这很原始,而且难以使用。一些 IDE 已经将 GUI 界面构建到 JDB 调试 API(如 Jikes)。JDB 是 JDK 安装的一部分。它在 Java 2 平台中得到了增强。
2. 如何用代码调试实物板
如何用代码调试实物板,什么是代码调试?
查找和改正错误的过程称为调试(debugging)。
调试的一般途径是采用各种方法逐步缩小程序中 bug 所在的范围。
二、常见的代码调试方式
2.1、手工跟踪(hand trace)
手工跟踪(hand trace)程序(即通过读程序找错误),也可以插入打印语句,显示变量的值或程序的执行流程。
2.2、手工跟踪的适用范围
这种方法适用于短小、简单的程序。
2.3、使用调试工具
对于庞大、复杂的程序,最有效的调试方法还是使用调试工具。
JDK 包含了一个命令行调试器 Jdb,结合一个类名来调用该命令。
Jdb 本身也是一个 Java 程序,运行本身的一个 Java 解释器的拷贝。
2.4、调试工具具备的特性
所有的 Java IDE 工具,比如 Eclipse 和 NetBeans 包含集成的调试器。调试器应用让你可以跟踪一个程序的执行。他们因程序的不同,但是大都支持以下特征中的多数:
3. jdb的命令列表
1. ** 命令列表 **
2. connectors - 列出此 VM 中可用的连接器和传送器 3.
4. run [类 [参数]] - 开始执行应用程序的主类 5.
6. threads [线程组] - 列出线程 7. thread <线程 ID> - 设置默认线程
8. suspend [线程 ID] - 暂停线程(默认为所有线程) 9. resume [线程 ID] - 恢复线程(默认为所有线程) 10. 其中 [<线程 ID> | all] - 转储线程的堆栈
11. 其中 [<线程 ID> | all] - 转储线程的堆栈,以及 pc 信息 12. up [n 帧] - 向上移动线程的堆栈 13. down [n 帧] - 向下移动线程的堆栈
14. kill <线程 ID> <表达式> - 中止具有给定的异常对象的线程 15. interrupt <线程 ID> - 中断线程 16.
17. print <表达式> - 输出表达式的值 18. mp <表达式> - 输出所有对象信息
19. eval <表达式> - 输出表达式的值(与 print 相同) 20. set <lvalue> = <表达式> - 为字段/变量/数组元素指定新值 21. locals - 输出当前堆栈帧中的所有局部变量 22.
23. classes - 列出当前已知的类 24. class <类 ID> - 显示已命名的类的详细信息 25. methods <类 ID> - 列出类的方法 26. fields <类 ID> - 列出类的字段 27.
28. threadgroups - 列出线程组 29. threadgroup <名称> - 设置当前线程组 30.
31. stop in <类 ID>.<方法>[(参数类型,...)]
32. - 在方法中设置断点 33. stop at <类 ID>:<行> - 在行中设置断点 34. clear <类 ID>.<方法>[(参数类型,...)]
35. - 清除方法中的断点 36. clear <类 ID>:<行> - 清除行中的断点 37. clear - 列出断点 38. catch [uncaught|caught|all] <类 ID>|<类模式>
39. - 出现指定的异常时中断 40. ignore [uncaught|caught|all] <类 ID>|<类模式>
41. -- 对于指定的异常,取消 catch 42. watch [access|all] <类 ID>.<字段名>
43. - 监视对字段的访问/修改 44. unwatch [access|all] <类 ID>.<字段名>
45. - 停止监视对字段的访问/修改 46. trace methods [线程] - 跟踪方法输入和退出 47. untrace methods [线程] - 停止跟踪方法输入和退出 48. step - 执行当前行
49. step up - 执行到当前方法返回到其调用程序 50. stepi - 执行当前指令
51. next - 跳过一行(跨过调用) 52. cont - 从断点处继续执行 53.
54. list [line number|method] - 输出源代码 55. use(或 sourcepath) [源文件路径]
56. - 显示或更改源路径 57. exclude [<类模式>, ...| “无”]
58. - 对于指定的类,不报告步骤或方法事件 59. classpath - 从目标 VM 输出类路径信息 60.
61. monitor <命令> - 每次程序停止时执行命令 62. monitor - 列出监视器 63. unmonitor <监视器号> - 删除监视器
64. read <文件名> - 读取并执行命令文件 65.
66. lock <表达式> - 输出对象的锁信息 67. threadlocks [线程 ID] - 输出线程的锁信息 68.
69. pop - 弹出整个堆栈,且包含当前帧 70. reenter - 与 pop 相同,但重新输入当前帧 71. redefine <类 ID> <类文件名>
72. - 重新定义类的代码 73.
74. disablegc <表达式> - 禁止对象的垃圾收集 75. enablegc <表达式> - 允许对象的垃圾收集 76.
77. !! - 重复执行最后一个命令 78. <n> <命令> - 将命令重复执行 n 次 79. help(或 ?) - 列出命令 80. version - 输出版本信息 81. exit(或 quit) - 退出调试器 82.
83. <类 ID>:带有软件包限定符的完整类名 84. <类模式>:带有前导或后缀通配符 (*) 的类名 85. <线程 ID>: threads 命令中报告的线程号 86. <表达式>:Java(TM) 编程语言表达式。 87. 支持大多数常见语法。 88.
89. 可以将启动命令置于 jdb.ini 或 .jdbrc 之中 90. (两者位于 user.home 或 user.dir 中
4. 如何让android启动时显示命令行
1.TraceView
1)功能:用于热点分析和性能优化,分析每个函数占用的CPU时间,调用次数,函数调用关系等
2)方法:
a)在程序代码中加入追踪开关
import android.os.Debug;
……
android.os.Debug.startMethodTracing(“/data/tmp/test”);// 先建/data/tmp目录
……// 被追踪的程序段
android.os.Debug.stopMethodTracing();
b)编译,运行后,设备端生成/data/tmp/test.trace文件
c)把trace文件复制到PC端
$ adb pull /data/tmp/test.trace ./
d)使用android自带工具分析trace文件
$ANDROID_SRC/out/host/linux-x86/bin/traceview test.trace
此时可看到各个函数被调用的次数CPU占用率等信息
e)使用android自带工具分析生成调用关系类图
$ apt-get install graphviz# 安装图片相关软件
$ANDROID_SRC/out/host/linux-x86/bin/dmtracemp -g test.png test.trace
此时目录下生成类图test.png
3)注意
trace文件生成与libdvm模块DEBUG版本相冲突,所以此方法只适用于对非DEBUG版本模拟器的调试,否则在分析trace文件时会报错
2.HProf (Heap Profile)
1)功能:
用于java层面的内存分析,显示详细的内存占用信息,指出可疑的内存泄漏对象
2)方法:
a)在代码中加入mp动作
import android.os.Debug;
import java.io.IOException;
……
try {
android.os.Debug.mphprofData(“/data/tmp/input.hprof”); // 先建/data/tmp目录
} catch (IOException ioe) {
}
b)把hprof文件复制到PC端
$ adb pull /data/tmp/input.hprof ./
c)使用命令hprof-conv把hprof转成MAT识别的标准的hprof
$ $ANDROID_SRC/out/host/linux-x86/bin/hprof-conv input.hprof output.hprof
d)使用MAT工具看hprof信息
下载MAT工具:http://www.eclipse.org/mat/downloads.php
用工具打开output.hprof
3)注意:此工具只能显示java层面的,而不能显示C层的内存占用信息
3.SamplingProfile (android 2.0上版本使用)
1)功能
每隔N毫秒对当前正在运行的函数取样,并输出到log中
2)在代码中加入取样设定
import dalvik.system.SamplingProfiler
……
SamplingProfile sp = SamplingProfiler.getInstance();
sp.start(n);// n为设定每秒采样次数
sp.logSnapshot(sp.snapshot());
……
sp.shutDown();
它会启一个线程监测,在logcat中打印信息
4.用发系统信号的方式取当前堆栈情况和内存信息
1)原理
dalvik虚拟机对SIGQUIT和SIGUSR1信号进行处理(dalvik/vm/SignalCatcher.c),分别完成取当前堆栈和取当前内存情况的功能
2)用法
a)$ chmod 777 /data/anr -R# 把anr目录权限设为可写
$ rm /data/anr/traces.txt# 删除之前的trace信息
$ ps # 找到进程号
$ kill -3 进程号 # 发送SIGQUIT信号给该进程,此时生成trace信息
$ cat /data/anr/traces.txt
功能实现:遍历thread list(dalvik/vm/Thread.c:dvmDumpAllThreadEx()),并打印当前函数调用关系(dalvik/vm/interp/Stack.c:mpFrames())
b)$ chmod 777 /data/misc -R
$ ps # 找到进程号
$ kill -10 进程号 # 发送SIGQUIT信事信号给该进程,此时生成hprof信息
$ ls /data/misc/*.hprof
此时生成hprf文件,如何使用此文件,见第二部分(HProf)
注意:hprof文件都很大,注意用完马上删除,以免占满存储器
5.logcat及原理
1)android.util.Log利用println的标准java输出词句,并加前缀I/V/D….
2)dalvik利用管道加线程的方式,先利用p2把stdout和stderr重定向到管理中(vm/StdioConverter.c:dvmstdioConverterStartup),然后再启动一个线程从管道另一端读出内容(dalvik/vm/StdioConverter.c:stdioconverterThreadSt art()),使用LOG公共工具(system/core/liblog/logd_write.c: __android_log_print())输出到/dev/log/*中去
3)logcat通过加不同参数看/dev/log/下的不同输入信息
# logcat -b main显示主缓冲区中的信息
# logcat -b radio显示无线缓冲区中的信息
# logcat -b events显示事件缓冲区中的信息
6.jdwp(java debug wire protocol)及原理
1)虚拟机(设备端)在启动时加载了Agent JDWP 从而具备了调试功能。在调试器端(PC端)通过JDWP协议与设备连接,通过发送命令来获取的状态和控制Java程序的执行。JDWP 是通过命令(command)和回复(reply)进行通信的。
2)JDK 中调试工具 jdb 就是一个调试器,DDMS也提供调试器与设备相连。
3)dalvik为JDWP提供了两种连接方式:tcp方式和adb方式,tcp方式可以手工指定端口,adb方式自动设定为8700端口,通常使用DDMS调试就是通过adb方式
7.monkey
1)monkey是一个android自带的命令行工具。它向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试。
2)方法
在设备端打开setting界面
$ adb shell
# monkey -p com.android.settings -v 500
此时可以看到界面不断被切换
8.其它小工具
具体见android.os.Debug中提供的工具
1)取毫微秒级的时间,用于计算时间
threadCpuTimeNanos()
2)统计两点间的内存分配情况
startAllocCounting()
stopAllocCounting()
getGlobalAllocCount()
get…..
3)打印当前已load的class
getLoadedClassCount()
printLoadedClasses()它需要打开NDEBUG功能才能打开system/core/中Log功能
9.打印debug信息
$ adb bugreport
5. Java有字节码级别的单步动态调试工具吗
作者:RednaxelaFX
链接:https://www.hu.com/question/36051329/answer/65735192
来源:知乎
着作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
例如这个?Bytecode Visualizer不过题主想要的功能多半还得在上面这个工具的基础之上再扩展一下。我自己做字节码层面调试的时候通常就直接用JDK自带的jdb命令行调试器,支持字节码层面调试,不过用起来当然没有带GUI的工具那么直观咯。之前写的一篇博文里有用jdb举过例子:借HSDB来探索HotSpot VM的运行时数据。虽然那篇没有提到,但其实用 stepi 和 nexti 命令就可以在jdb里做字节码层面的单步调试(普通的基于代码行的单步调试命令则是 step 和 next,少个i后缀)。jdb的字节码层面调试最让人不爽的一点就是它不能在任意字节码指令上设断点。我以前用jdb都是只能设方法入口断点然后不断的 stepi 单步走到我要的指令上。这对稍微复杂一点的调试工作来说就极其纱布。jdb间接基于JVMTI实现,而JVMTI的SetBreakpoint函数其实是可以在任意字节码指令上设断点的,只要GetJLocationFormat返回1(JVMTI_JLOCATION_JVMBCI)。jdb直接基于的是JVMTI之上的Java层包装,JDI。它的本体入口在这里:jdk7u/jdk7u/jdk: e228aaace9c9 src/share/classes/com/sun/tools/example/debug/tty/TTY.java而断点相关的部分在这里:jdk7u/jdk7u/jdk: e228aaace9c9 src/share/classes/com/sun/tools/example/debug/tty/BreakpointSpec.java鼓捣鼓捣这里就能让它支持字节码指令层面(BCI,bytecode index)的断点…
6. 下列哪个选项是Java调试器,如果编译器返回程序代码的错误,可以用它对程序进行调试( )
调试器--jdb.exe(转)
Java调度器为Java程序提供了一个命令行调试环境。它既可在本地,也可在与远程的解释器的一次对话中执行。
jdb于本地机器中可用如下的命令启动:
C:>jdb classname
当你使用-debug选项开始一个Java例程时, 必须提供给Jdb 一个密码, 这样 Jdb才能开始运转起来。下表包含了所有jdb命令。
选项 功能
catch calssID 为特定异常出口而中断
classes 列出当前已知的类
clear classID:line 清除一个断点
cont 从断点处继续执行
down[n frames] 下移一个线程的堆栈
mp ID[ID...] 显示所有对象信息
exit(或quit) 退出调试器
help(或?) 列出所有命令
ignore classID 忽略特定的异常出口
list[line number] 显示源代码
load classbame 载入要调试的Java类
locals 在当前堆栈帧中显示所有局部变量
memory 报告内存使用情况
methods classID 列出一个类的成员函数集
print ID[ID...] 列出对象或域
resume [threadID...] 恢复线程(默认情况恢复所有线程)
run class [args] 开始执行已下载的Java类
step 执行当前行
stop in classID:method 在一成员函数中设一断点
stop at classID:line 在一行设一断点
suspend[threadID...] 停止一个线程(默认情况停止所有线程)
hreads threadgroup 列出线程
thread threadID 设置当前线程
threadgroups 列出线程组
threadgroup name 设置当前线程组
up [n frames] 上移一个线程堆栈
use [path] 显示或改变源程序路径
where [threadID] or all 使一线程的堆线置空
!! 重复上一次命令
-host hostname 该命令告诉Jdb到哪里去建立远程运行的Java解释器对话过程
-password password 本选项告诉Jdb 用哪个密码去与远程运行的Java 对话进程相连接。 密码 password是由运行带有-debug选项的Java解释器所提供的。
7. java项目中如何打断点测试
如果使用的是MyEclipse或者eclipse,只需要在编辑器中对你认为容易出问题的地方左边对应的行数双击添加断点即可,然后启动debug(也就是debug模式启动),就是工具栏中像独角仙的那个。。
8. jdb什么意思
JDB是基于文本和命令行的调试工具(例如Sun JDB)。
虽然有一些很好的调试工具,然而 Java 调试器 (JDB) 提供了一些优点。最重要的是 JDB 可以免费获取并且是平台独立的。
相关信息:
其缺点是它只有命令行格式,一些开发人员认为这很原始,而且难以使用。一些 IDE 已经将 GUI 界面构建到 JDB 调试 API(如 Jikes)。JDB 是 JDK 安装的一部分。它在 Java 2 平台中得到了增强。
JDB还有很多的调试手段,除了上面那些最常用的,其他很重要的还有clear清除断点,use设置源程序路径,memory显示当前内存使用状况,gc强制进行内存回收,重复上面的命令,thread设置当前线程,quit和exit退出jdb等,还有远程调试等内容,都很有用。
9. java中调用jdb去debug别的程序要怎么编
java.lang.Process p=java.lang.Runtime.getRuntime().exec(命令行);
InputStream in=getInputStream();
OutputStream out=getOutputStream();
在out流里写命令,从in流里得到返回,理论上可以,没试过。