使用JDB调试Java程序
Java程序中有逻辑错误,就需要使用JDB来进行调试了。调试程序在IDE中很方便了,比如这篇博客介绍了在Intellj IDEA中调试Java程序的方法。
我们课程内容推荐在Linux环境下学习,有同学问如何在命令行下调试Java程序,我们就要使用JDB了。
学习建议:Linux Bash下打开三个标签页
我们提倡在Linux命令行下学习Java编程。学习时在Ubuntu Bash中通过Ctrl+Shift+T
快捷键打开三个标签(tab),:一个使用vim编辑代码;一个使用javac, java(或ant, gradle...)编译运行代码;一个使用JDB调试代码。
如下图所示,这样就不用在一个窗口中进行编辑,编译运行和调试的切换了,能提高效率。
如上图, 我们在Linux Bash中输入 vim HelloJDB.java
编辑调试示例代码:
1 public class HelloJDB {
2 public static void main(String[] args) {
3 int i = 5;
4 int j = 6;
5 int sum = add(i, j);
6 System.out.println(sum);
7
8 sum = 0;
9 for(i=0; i< 100; i++)
10 sum += i;
11
12 System.out.println(sum);
13 }
14
15 public static int add(int augend, int addend){
16 int sum = augend + addend;
17 return sum;
18 }
19}
代码编辑完,我们按“:w”进行保存而不是“:wq”进行保存退出,这样在编译或调试中遇到问题就可以按Alt+1
进入第一个标签修代码了。
我们按Alt+2
进入第二个标签,使用javac -g -d bin src/HelloJDB.java
对程序进行编译。注意javac中-g参数是为了产生各种调试信息,一定要加上,否则无法调试。
我们按Alt+3
进入第三个标签,使用jdb -classpath .:./bin HelloJDB
对程序进行调试。
调试基础
调试程序先要学会设置断点,这样才能让程序停在你感觉有问题的代码处进行排查。学习调试我们要学会设置四种断点:
- 方法断点
- 行断点
- 条件断点
- 临时断点
我们在JDB中输入help
可以查看命令列表:
上图中的stop in 用来设置方法断点,stop at 设置行断点。学习过程中要经常查看帮助文档。
上图汉化有个错误,stepi
下面的下一步
应该是next
命令,这两个都是单步执行命令,我们后面会解释step
和next
的区别。
我们通过运行stop in HelloJDB.main
命令在main方法开始处设置断点:
如上图,我们输入run
命令来运行HellJDB.class,程序会在main()的开始处停下。
此时可以用locals命令查看变量,用step命令运行下一行代码:
看两条locals
命令的结果,开始只有main方法的参数args,后面就有局部变量i,j的值了。
不使用locals
命令,我们可以使用print
或eval
命令来查看变量的值:
我们可以使用list
来查看运行到了源代码的什么位置,HelloJDB.class文件和HelloJDB.java不在同一个文件夹下,我们需要使用use
或sourcepath
指出源代码的位置,下图中的箭头指出代码运行到了哪一行:
大家注意上图是将要运行第五行,但还没有运行。还要注意,第五行是个方法调用。我们继续输入step
和list
,我们发现代码跳入16行方法体中了:
一般说来,调试时遇到方法调用,我们先看调用结果对不对,结果正确,说明方法没有问题,就不用进入方法体了; 方法调用结果不对,我们才需要进入方法体进行调试。单步跟踪命令next
和step
在执行一般语句时没有区别,在执行有方法调用的语句时,next
会把方法执行完,step
会进入方法体。所以在调试时,单步执行我们要优先使用next
,这样效率比较高。
现在已经进入方法体了,我们可以运行step up
把方法执行完,返回调用处,后面执行一般语句,你发现next
和step
没有区别。
第九行和第十行是个循环,这两条语句单步执行起来有点费劲。
我们可以通过stop at HelloJDB:12
在第12行设个断点,然后运行cont
就会一下子把循环运行完并停在第十二行。cont是continue的缩写,功能是运行到下一个断点处停止。
我们可以用stop
或clear
命令查看设置的断点的情况。
其实这里最好用个临时断点,还有,如果第9行问题出在i=80处,我们就需要条件断点,可惜JDB不支持临时断点和条件断点。
我们使用quit
或exit
可以退出JDB。
类的调试
递归的学习
递归算法是一种直接或间接地调用自身的算法。在编写程序时,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归用于解决形式相同,规模不同的问题,能用递归解决的问题都可以转化为循环。递归把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。
递归程序有两个要点:递归公式和结束条件。我们以求整数的阶乘为例:
有了公式,代码就容易写出来了:
1 public class Factorial {
2 public static void main(String [] args) {
3 System.out.println(fact(5));
4 }
5
6 public static int fact(int n) {
7 if (n == 0)
8 return 1;
9 else
10 return n * fact(n-1);
11 }
12 }
fact(5)的递推过程如下图:
我们设置好断点:
方法调用一次就会形成一个栈帧,我们在JDB中用where显示栈帧,用up,down可以在栈帧之间跳转。
大家用up,down 体会一下压栈,出栈:
多线程的调试
Java API的学习
JDB 不但是个好的调试工具,也是一个好的学习工具,可以让你了解程序的动态执行过程。
其他
JDB没有GDB那么强大,如果想使用GDB调试Java代码,以参考[用GDB 调试Java程序 ](http://blog.csdn.net/haoel/article/details/22893
05)。
参考资料
欢迎关注“rocedu”微信公众号(手机上长按二维码)
做中教,做中学,实践中共同进步!
版权声明:自由转载-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0
如果你觉得本文对你有帮助,请点一下左下角的“好文要顶”和“收藏该文”
使用JDB调试Java程序的更多相关文章
- 命令行工具jdb调试Java程序
一直在gdb 下调试c/c++程序. 突然要写个java程序,又不是很喜欢使用eclipse,那怎么调试程序呢.你还可以使用 jdb. 它是jdk 内置的一个java debug工具.类似与 gdb. ...
- 如何使用加多宝(jdb)在linux下调试Java程序
毕业时写了一段时间的C,那时候调试使用gdb,后来转了java,当时就想java程序怎么调试,找了一下,果然,那就是jdk自带的jdb windows里是这样的 Linux下是这样的 一般我在linu ...
- 用GDB 调试Java程序
陈皓 http://blog.csdn.net/haoel 背景 想要使用GDB调试程序,就需要用GNU的编译器编译程序.如:用GCC编译的C/C++的程序,才能用GDB调试.对于Java程序也是 ...
- eclipse 附加进程调试java程序(转)
转自:http://blog.csdn.net/zhoushenghuang/article/details/54485645 第一步,启动Java程序时需要设置JVM参数 右击java项目-> ...
- 浅谈1——用Eclipse调试JAVA程序
本篇博客主要介绍如何用Eclipse调试简单的JAVA程序. 1.如下图,一个简单的JAVA程序 2.设置断点. 方法:选中需设置断点的行代码,按快捷键Ctrl+Shift+B,设置断点: 断点设置 ...
- 使用shell/bat脚本调试java程序示例
一.linux下shell启动java #!/bin/sh JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre # JVM_OPT ...
- 远程调试Java程序
java 可以以调试模式启动,启动后可以使用 jdb 对程序进行调试.以调试模式启动,需要加入以下参数: java -Xdebug -Xrunjdwp:transport=dt_socket,addr ...
- eclipse调试java程序的九个技巧
转:http://www.cnblogs.com/lingiu/p/3802391.html 九个技巧: 逻辑结构 条件debug 异常断点 单步过滤 跳到帧 Inspect expressions ...
- 使用 Eclipse 调试 Java 程序的 10 个技巧
你应该看过一些如<关于调试的N件事>这类很流行的帖子 .假设我每天花费1小时在调试我的应用程序上的话,那累积起来的话也是很大量的时间.由于这个原因,用这些时间来重视并了解所有使我们调试更方 ...
随机推荐
- 简述public private protected internal修饰符的访问权限
public 关键字是类型和类型成员的访问修饰符.公共访问是允许的最高访问级别.对访问公共成员没有限制. protected 关键字是一个成员访问修饰符.受保护成员在它的类中可访问并且可由派生类访问. ...
- window7 32位安装Oracle11g
http://www.cnblogs.com/wangsaiming/p/3573509.html
- SpringMVC4+MyBatis3+SQLServer 2014 整合(包括增删改查分页)
前言 说起整合自然离开ssm,我本身并不太喜欢ORM,尤其是MyBatis,把SQL语句写在xml里,尤其是大SQL,可读性不高,出错也不容易排查. 开发环境 idea2016.SpringMVC4. ...
- [数据挖掘] - 聚类算法:K-means算法理解及SparkCore实现
聚类算法是机器学习中的一大重要算法,也是我们掌握机器学习的必须算法,下面对聚类算法中的K-means算法做一个简单的描述: 一.概述 K-means算法属于聚类算法中的直接聚类算法.给定一个对象(或记 ...
- 免费企业ERP系统OA+ERP
AIO5基于B/S架构而研发,集成了OA(办公自动化).SCM(供应链管理).FM(财务管理)三大主力单元.支持手机APP. 协助中小型企业全面管理采购.销售业务, 规范仓库进出,处理与合作伙伴的往来 ...
- Kafka Eagle 源码解读
1.概述 在<Kafka 消息监控 - Kafka Eagle>一文中,简单的介绍了 Kafka Eagle这款监控工具的作用,截图预览,以及使用详情.今天笔者通过其源码来解读实现细节.目 ...
- AR入门系列-04-vuforia识别多个图片及同屏展示
首先,我们需要在官网中识别数据库添加多张图片,并将数据库下载下来覆盖原来的数据库 在 Hierarchy视图中需要多个ImageTarget 将新建的ImageTarget(1) 选择数据库中的识别图 ...
- Yii 2.0 ActiveForm生成表单 ,控制表单label和filed样式,filed一旦报错,前面lable颜色跟着变,看图,帮你解决
需要生成如下图的表单样式,图一:
- Java并发之任务的描述和执行
简单概念 <Java编程思想>对并发概念的重要性阐述: Java是一种多线程语言,并且提出了并发问题,不管你是否意识到了.因此,有很多使用中的Java程序,要么只是偶尔工作,要么是在大多数 ...
- tp框架基础(详细步骤分解,易懂)下
在浏览器中如果要访问操作方法的时候以什么方式来访问 有四种方式 第一种是get方式,第二种是访问路径 这四种方式我们可以通过修改配置文件来改掉url的模式 我们需要来改一下我们的配置文件 在这个路径下 ...