【发布时间】:2010-11-09 16:33:25
【问题描述】:
我想根据我是否正在调试来更改日志记录级别,但我找不到代码 sn-p 来检查应用程序是否在调试模式下运行。
我正在使用 eclipse 来调试应用程序,所以如果该解决方案仅在 Eclipse 中有效,那就没问题了。
【问题讨论】:
标签: java eclipse debugging logging
我想根据我是否正在调试来更改日志记录级别,但我找不到代码 sn-p 来检查应用程序是否在调试模式下运行。
我正在使用 eclipse 来调试应用程序,所以如果该解决方案仅在 Eclipse 中有效,那就没问题了。
【问题讨论】:
标签: java eclipse debugging logging
在how-to-find-out-if-debug-mode-is-enabled找到答案
boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean().
getInputArguments().toString().indexOf("-agentlib:jdwp") > 0;
这将检查是否使用了Java Debug Wire Protocol 代理。
【讨论】:
-Xrunjdwp,我已经制作了这段代码来查找两个JVM args。
您可以修改调试配置。例如,仅在调试配置中添加一个特殊的 VM 参数。您可以使用System.getProperties() 来读取提供的参数。
更好的是,修改配置(运行和调试)以加载不同的日志记录配置文件。如果您需要编写代码来确定日志记录级别,那就不好了。这应该只是配置问题。
【讨论】:
没有官方认可的方法可以从 JVM 内部可靠地确定任何给定的 JVM 是否处于调试模式,并且依赖工件只会在未来某个时间破坏您的代码。
因此,您需要自己介绍一种方法。建议:
【讨论】:
您是否尝试过在 eclipse 运行配置中添加 vm 参数?
将此作为 VM 参数传递
-Ddebug=true
那么您可以通过Boolean.getBoolean("debug") 进行检查。
【讨论】:
如果您是从自己的程序中设置调试级别,可能是这样的一行:
public static final boolean DEBUG_MODE = System.getProperty("java.vm.info", "").contains("sharing");
会成功的。
刚刚在eclipse3.5中测试过:
package test;
public class Test
{
/**
* @param args
*/
public static void main(String[] args)
{
System.out.println(System.getProperty("java.vm.info", ""));
}
}
将显示:
mixed mode, sharing
如果在没有调试的情况下启动
mixed mode
如果使用调试启动器执行
Joachim Sauercmets:
这高度依赖于系统。
我假设“共享”表示跨 VM 类共享处于活动状态。
这是一项非常新的功能,仅在某些平台上可用。
此外,启用或禁用它的原因可能有很多,因此我不会将其用于调试模式检测。
(注意:我使用最新的 jdk1.6b14 对其进行了测试。我将其保留为 CW 答案。)
【讨论】:
java.vendor”
看看这里:
http://wiki.eclipse.org/FAQ_How_do_I_use_the_platform_debug_tracing_facility%3F
此外,我认为您无法知道您的应用是否在调试模式下运行。您唯一能做的就是在调试时将参数传递给 JVM。
手动
【讨论】:
如果使用套接字(例如 9999),您可以调用 netstat 来检查是否建立了连接:
Process p = new ProcessBuilder("netstat", "-n").start();
String stdout = IOUtils.toString(p.getInputStream(), Charset.defaultCharset());
然后在标准输出中扫描 127.0.0.1:9999.*ESTABLISHED
【讨论】: