如何在不使用集成开发环境的情况下调试Java程序?

14

如何在Java程序中打开和关闭调试模式?
如何在不重新编译Java程序的情况下打开和关闭调试模式?


4
这就是记录日志的用途。您可以轻松简单地设置日志状态。 - Hovercraft Full Of Eels
2
不清楚。您想要做什么?您想如何进行调试? - fge
2
我同意@HovercraftFullOfEels的观点。使用日志记录并将日志级别设置为您想要的任何级别。 - Mohammad Banisaeid
你不能在编译时打开或关闭调试功能,所以这不是你必须避免的问题。(你可以关闭调试信息,但你很少需要这样做。) - Peter Lawrey
4个回答

18
Java虚拟机的一个设置允许调试器(例如jdb)进行附加。 请参见 http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html 这是重要的一部分:
在启用调试的JVM中运行MyClass:
java -agentlib:jdwp=transport=dt_shmem,address=jdbconn,server=y,suspend=n MyClass

使用 jdb 调试器

jdb -attach jdbconn 

注意:这些选项设置是为了在本地机器上通过共享内存连接JVM和调试器,其他有用的设置允许通过网络套接字连接到远程机器上的JVM。


2
原帖作者可能真正想表达的内容有:1)打开和关闭日志输出;2)编译时添加调试信息(类似于C/C++)。 - mvw
很高兴你想帮助提问者。然而,有时仅留下一个链接的答案可能会有害。虽然你的回答现在很好,但如果链接失效,你的回答就会失去价值。因此,如果你能在回答中总结文章内容,那将非常有帮助。请参考这个问题以获得更多澄清。 - pascalhein

2

需要考虑两个问题:

  • 只需编译一次代码即可获得调试信息;默认情况下会生成源文件和行号调试信息(文档);
  • 是否能够进行调试是在调用JVM时控制的。

对于Oracle的JVM,使用以下选项可以允许在12345端口(TCP)上插入实现JDWP(Java调试线路协议)的调试器:

-Xdebug -Xrunjdwp:server=y,suspend=n,transport=dt_socket,port=12345

请注意suspend=n;如果你设置为suspend=y,JVM将不会运行,除非你实际连接了一个调试器...
最后,这里有一个很好的链接,解释了JDWP背后的细节:这里 这里也有一个jdb的教程,其他答案已经提到过:这里

1

使用jdb在命令行进行调试。

话虽如此,我不知道“关闭和打开调试”是什么意思。


1
有些编程语言需要在编译时请求调试器支持,而不是像Java一样在运行时。 - Thorbjørn Ravn Andersen

0

不使用IDE进行调试

1)您可以使用断言编写Java程序。您可以随时启用/禁用它们。

2)您可以使用配置了log4j.properties的日志记录。在您的Java程序中,您可以指定信息和调试日志,每当您想要显示调试或信息日志时,您可以简单地在log4j.properties中进行配置等...


我们如何使用日志记录器? - Abinash Sinha
1
您可以轻松地配置log4j-1.3alpha0.jar、log4j.properties文件和 b) org.apache.log4j.Logger logs = Logger.getLogger(MyJavaFile.class); logs.info("这是信息日志"); logs.debug("这是调试日志");(所有的System.out.pritnln()都可以在log.info()示例中使用 logs.info("用户名"+username);等...)在log4j.properties中,您可以指定:log4j.rootLogger=INFO 或 log4j.rootLogger=DEBUG - Akshat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接