小编是刚学习Java两个月,在学习视频中看到老师玩断点6到飞起,自己也就各种查资料,实施并总结了一下断点的调试。
你可能会问,我怎么知道在哪设置断点呢?
断点大家都比较熟悉,在Eclipse Java 编辑区的行头,双击需要放置断点的程序左边的栏目上。如下图所示:
在左边的栏目上,鼠标右键,选择"Breakpoint Properties......"
断点的属性界面以及各个选项的意思,如下图:
下图就是在一个变量上打的断点,在变量值的初始化,或是变量值改变时可以停止,当然变量断点上也是可以加条件的,和 上面的介绍的条件断点的设置是一样的
方法断点的特别之处在于它可以打在 JDK的源码里,由于 JDK 在编译时去掉了调试信息,所以普通断点是不能打到里面 的,但是方法断点却可以,可以通过这种方法查看方法的调用栈
打开Debug模式的三种方式:
或者
以debug方式运行java程序后
(F5)单步执行程序,遇到方法时进入:按F5就是一层层深入的debug相当于剥葱样,会进入每个方法内部;
(F6)单步执行程序,遇到方法时跳过: 按F6就是在当前函数一步步debug,不理会深层次运作;
(F7)单步执行程序,从当前方法跳出: 按F7就是如果当前进入了某个方法内部,都跳转到该方法的结尾代码处;
(F8)直接执行程序。遇到断点时暂停: 按F8就是如果后面还有断点,则运行到下一断点处,否则运行完程序;
另外在debug时,会有很多有用信息显示在debug框里,如堆栈信息,需要自己实践;在程序界面里,鼠标移到变量上时会有当前变量的属性值。
在变量窗口中右击变量,在弹出的菜单中选择[change value],弹出修改画面。 改变其值后,按下ok按钮;这时变量的值就改为修改后的值了。
第一步:点击"Change Value...."
第二步:插入值
第三步:修改值
下面按钮第一个是进入方法执行,比如你调用了其他方法,可以进入方法一步一步执行,如果点击第二个按钮,只会在本方法内一步一步执行,第三个按钮时你跳出此方法,继续执行调用这个方法的原方法,说明如下。
在程序运行的时候,想看看某段程序运行的结果是否正确,或者查看某个变量的值时:
在eclipse程序中设置的断点上有一个斜杠,正常启动debug不能够跳转到debug页面,怎么解决?
在run菜单里面,把"skip all breakpoints"选项勾去即可,这个选项可能是你无意间选上的。
远程调试分为两种方式:【使用远程调试的前提是服务器和客户端的代码是一致的】
属性解释:
示例1:显示如何在调试模式下启动 VM 并监听端口 8765 的套接字连接?
作为调试服务器的目标 VM:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8765
示例2: 显示如何使用位于 8000 端口的主机 127.0.0.1 上的套接字连接运行中的调试器应用程序?
作为调试客户机的目标 VM:
-Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000
设置断点
在你认为可能出现问题的地方设置断点。
本机作为客户端
本机作客户端比较常用,需要在远端的服务器上的java程序在启动时打开远程调试开关。
服务器端需要加上虚拟机参数
1.5以前版本(1.5以后也可用):【-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 】
1.5及以上版本:【 -agentlib:jdwp=transport=dt_socket,server=y,address=8000】
F:\Study\eclipsepro\screensnap>java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 -jar screensnap3.jar
连接时远程服务器时,需要在Eclipse中新建一个远程调试程序
这里有一个小地方需注意,连接上的时候貌似不能自动切换到Debug视图,不要以为本机的调试程序没有连接到服务器端。
本机作为服务端
同本机作为客户端相比,只需要修改一下“Connection Type”
这时Eclipse会进入到等待连接的状态
连接程序使用如下参数即可连接本机服务器,IP地址请用实现IP替换~~
【-agentlib:jdwp=transport=dt_socket,suspend=y,address=127.0.0.1:8000】
F:\Study\eclipsepro\screensnap>java -agentlib:jdwp=transport=dt_socket,suspend=y,address=127.0.0.1:8000 -jar screensnap3.jar
远程调试时本地的代码修改可同步到远程,但不会写到远程的文件里,也就是说本地修改会在下次启动远程程序时就没有了,不会影响到下次使用时的远程代码。