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