没有调试器的JVM调试

时间:2014-10-24 05:00:44

标签: debugging jvm symbols

对JVM调试不感兴趣。

我一直致力于支持基于用C / C ++编写的VxWorks的其他产品。在该环境中,我们能够在实时系统上进行符号查找,并查看或查找内存以了解软件正在执行的操作,或在其他“常规”配置选项不可用时更改它。

现在我正在支持java应用程序。对于在我们的实验室中不易重现的问题,我们将简化为使用其他仪器进行重新编译并执行二进制替换以收集更多信息以了解sw中发生的情况。

这些应用程序总是在人们不需要重新启动的应用程序上。

是否可以为JVM应用程序采用类似的调试类型?这些都在客户站点上运行,由于多种原因,使用传统调试器不是一种选择。

请不要讲授应用程序的支持能力如何设计不佳。这是一个给定的,我们只是支持的几个人必须尽我们所能。

感谢, 安倍

1 个答案:

答案 0 :(得分:0)

我一直处于类似情况,在调试器中停止应用程序会触发较低层的超时,并且由于重新启动而添加检测工具很烦人。

对我来说,解决方案是添加更多日志记录语句。 我已经使用了slf4j API,使用了logback实现,我enabled JMX on JVM并根据需要将它用于enable/disable logging和/或更改记录的类。 如果你使用slf4j / logback the right way,那么禁用日志语句的开销很小,所以我能够大量使用它们。

通过这种方式,我可以打开“调试工具”,而不会让重新启动的用户烦恼。

现在有些代码:

这是实验的测试平台

package pl.gov.mofnet.giif.logondemand;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogOnDemand {
    private static final Logger log = LoggerFactory.getLogger(LogOnDemand.class);

    public static void main(String []args) throws InterruptedException {
        for (int i = 0; i < 1000; i++) {
            log.debug("i: {}", i);
            Thread.sleep(1000);
        }
    }
}

此文件需要放在默认包中(或类路径上的任何位置)。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <jmxConfigurator />

  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%date [%thread] %-5level %logger{25} - %msg%n</Pattern>
    </layout>
  </appender>

  <root level="info">
    <appender-ref ref="console" />
  </root>  
</configuration>

此代码对org.slf4j具有编译时依赖性:slf4j-api:1.7.7和ch.qos.logback上的运行时依赖性:logback-classic:1.1.2

运行此代码,在Java 7中,如果从同一台计算机连接到JMX,则不必显式启用JMX。您将看到控制台上没有输出保存初始Logback配置消息。

启动 jconsole ,连接到此流程,在MBeans选项卡中,您会发现ch.qos.logback.classic节点,其下方有operations

将参数编辑为setLoggerLevel,将p1设置为类的包名称,在本例中为pl.gov.mofnet.giif,p2为debug。按 setLoggerLevel 按钮运行此操作,您应该在控制台上看到日志消息。禁用日志记录重置记录器级别为info或更高。