我们如何获取 Java 中成功执行的行的堆栈跟踪?需要调试问题。
我不需要普通的堆栈跟踪,我想知道特定行在幕后正在做什么。
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("/opt/data/ws_server.xml"));
serviceHelper = (ServiceHelper)factory.getBean("serviceHelper");
//Assuming no exceptions, print/view stack trace of above line (factory.getBean).
我想查看factory.getBean的堆栈跟踪 - 如下所示,以了解factory.getBean正在做什么。
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:757)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:721)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:384)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:156)
- locked <0xffffffff58100608> (a java.util.concurrent.ConcurrentHashMap)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
最佳答案
最后,您需要某种仪器。换句话说:您想要告诉 jvm 跟踪调用堆栈,更重要的是,以编程方式提供该信息。
即使您只希望针对特定方法发生这种情况,jvm 仍然必须跟踪所有方法调用,因为它无法知道最终是否调用了要跟踪的方法之一。因此,无法在不影响性能的情况下轻松跟踪方法调用。我知道的工具可以将性能影响保持在合理的水平,例如 XRebel,用于以后的评估,而不是用于程序消耗。
换句话说:挂起情况的唯一解决方案是:
- 进行线程转储并分析它
- 在代码运行时进行大量日志记录/跟踪,以分析是否发生挂起
需要明确的是:您所要求的,在事实发生后获取已执行代码的堆栈跟踪是不可能实现的!
关于java - 如何获取 Java 程序特定行的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55292843/