Debugging 没有调试器的JVM调试

Debugging 没有调试器的JVM调试,debugging,jvm,symbols,Debugging,Jvm,Symbols,对JVM调试来说是新的 我一直致力于支持其他基于C/C++编写的VxWorks的产品。在这个环境中,我们能够在一个实时系统上进行符号查找,并查看或戳内存,以了解软件正在做什么,或者在其他“正常”配置选项不可用时对其进行更改 现在我支持java应用程序。对于我们实验室内不易再现的问题,我们将减少使用额外仪器重新编译,并执行二进制替换,以收集更多信息,了解软件内发生的情况 这些应用程序总是出现在人们不愿意重新启动的应用程序上 JVM应用程序是否有类似类型的调试?它们在客户站点上运行,由于许多原因,在

对JVM调试来说是新的

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

现在我支持java应用程序。对于我们实验室内不易再现的问题,我们将减少使用额外仪器重新编译,并执行二进制替换,以收集更多信息,了解软件内发生的情况

这些应用程序总是出现在人们不愿意重新启动的应用程序上

JVM应用程序是否有类似类型的调试?它们在客户站点上运行,由于许多原因,在这些站点上使用传统的调试器不是一个选项

请不要讲授应用程序在支持能力方面设计得如何糟糕。这是一个给定的,我们只是一对支持的人,他们必须尽我们所能解决这个问题

谢谢,
Abe

我也遇到过类似的情况,在调试器中停止应用程序会触发较低层上的超时,并且由于重新启动,添加指令插入很烦人

对我来说,解决方案是添加更多日志记录语句。 我使用了slf4j API和logback实现,并根据需要使用它和/或更改记录的类。 若您使用slf4j/logback,禁用的log语句的开销很小,所以我可以自由地使用它们

通过这种方式,我可以打开“调试工具”,而不用重新启动来烦扰用户

下面是一些代码:

这是实验的试验台

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);
        }
    }
}
包pl.gov.mofnet.giif.logondemand;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
公共类LogOnDemand{
私有静态最终记录器log=LoggerFactory.getLogger(LogOnDemand.class);
公共静态void main(字符串[]args)引发InterruptedException{
对于(int i=0;i<1000;i++){
debug(“i:{}”,i);
睡眠(1000);
}
}
}
此文件需要放在默认包中(或类路径上的任何位置)


%日期[%thread]-5级别%logger{25}-%msg%n
此代码对org.slf4j:slf4j api:1.7.7具有编译时依赖性,对ch.qos具有运行时依赖性

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

启动jconsole,连接到此进程,在MBeans选项卡中,您将找到
ch.qos.logback.classic
节点,其下方有
操作


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

在“非常规调试器”中需要什么样的功能?如果不连接到正在运行的JVM,我无法想象它是否有用(这是否已经“出于许多原因不是一个选项”?)目标系统是什么(有些系统有DTrace之类的工具)?您可以删除“not reps”文本,并添加一些示例/代码如何/做了什么,以使这成为一个很好的答案。
<?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>