Java关于远程调试程序教程(以Eclipse为例)

2025-05-29 0 93

本节尝试一下java远程调试的东西,记录一遍简单入门的东西。也就算是使用记录吧!

写一个简单程序打成jar丢到远程服务器运行,模拟远程server在运行。就拿java调用shell脚本提交作业程序为例分析。源码如下(如下程序就是一个简单示例代码,不要在乎代码规范):

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42
import java.io.inputstream;

public class javashell {

public static void main(string[] args) throws exception {

try {

string grant = "chmod u+x submit-job.sh";

runtime runtime = runtime.getruntime();

process grantproc = runtime.exec(grant);

int resultcode = grantproc.waitfor();

system.out.println(resultcode);

grantproc = runtime.exec("./submit-job.sh");

resultcode = grantproc.waitfor();

system.out.println(resultcode);

inputstream in = grantproc.getinputstream();

byte[] buffer = new byte[1024];

int code;

while ((code = in.read(buffer, 0, buffer.length)) != -1) {

system.out.print(new string(buffer, 0, code));

}

/**

* 死循环阻止debugger没有连接上之前程序退出(测试suspend参数功能)

*/

system.out.println("shell脚本执行完毕,接下来开始进行定时打印任务!");

int i = 0;

while (true) {

thread.sleep(2000);

system.out.println("这是第" + (++i) + "次循环!");

}

} catch (exception e) {

system.out.println("this is a excption !");

} finally {

}

}

}

打成jar包提交到远程服务器之后运行:

复制代码 代码如下:

java -xdebug -xnoagent -djava.compiler=none -xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=y -jar javashell.jar

Java关于远程调试程序教程(以Eclipse为例)

会发现程序阻塞,并等待debugger连接,此时我们可以使用eclipse进行远程调试

Java关于远程调试程序教程(以Eclipse为例)

点击debugger即可进行连接,跟踪源码运行:

Java关于远程调试程序教程(以Eclipse为例)

远程有输出,证明远程程序正在跟踪debugger执行:

Java关于远程调试程序教程(以Eclipse为例)

到此我们就完成了调试的过程。接下来试一下参数suspend=n的情况:

复制代码 代码如下:

java -xdebug -xnoagent -djava.compiler=none -xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=n -jar javashell.jar

此时会发现远程程序并没有阻塞等待调试器debugger连接,而是程序正常执行:

Java关于远程调试程序教程(以Eclipse为例)

此时我们可以使用eclipse的远程debugger进行远程调试,但是需要注意:此时我们本地的断点只能打在远程还没有执行的代码处或者正在执行的代码位置,例如我们就可以在死循环中打断点(死循环是一直正在执行的代码):

Java关于远程调试程序教程(以Eclipse为例)

然后启动debugger之后:

Java关于远程调试程序教程(以Eclipse为例)

停留在断点处。然后跟着断点位置继续我们的debug工作。到此就应该可以知道suspend参数的作用了:

在jvm debug参数中,有一个参数叫"suspend",它的取值有两个,“y”或者“n”。

如果您刚开始就想调试的话,将参数设置为"suspend=y",这样eclipse会远程连接java应用程序。

如果你想先运行项目,然后连接eclipse,那么可以将参数设置为"suspend=n",这样的话,java应用程序会正常运行,之后eclipse会开始远程连接。

更多参数细节:

-xdebug 启用调试。
-xnoagent 禁用默认sun.tools.debug调试器。
-djava.compiler=none 禁止 jit 编译器的加载。
-xrunjdwp 加载jdwp的jpda参考执行实例。
transport 用于在调试程序和 vm 使用的进程之间通讯。
dt_socket 套接字传输。
dt_shmem 共享内存传输,仅限于 windows。
server=y/n vm 是否需要作为调试服务器执行。
address=3999 调试服务器的端口号,客户端用来连接服务器的端口号。
suspend=y/n 是否在调试客户端建立连接之后启动 vm 。

eclipse debug快捷键:

f5 step into
f6 step over
f7 step out
f8 continue to the next breakpoint

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://www.cnblogs.com/leodaxin/p/7678524.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java关于远程调试程序教程(以Eclipse为例) https://www.kuaiidc.com/111512.html

相关文章

发表评论
暂无评论