如何获取 Java 程序特定行的堆栈跟踪

How do I get stacktrace of a particular line of Java program

我们如何获取 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.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)

请看下面的回答。

Get current stack trace in Java

基本上是Thread.currentThread().getStackTrace()

最后,您需要某种仪器。换句话说:您想告诉 jvm 跟踪调用堆栈,更重要的是,以编程方式使该信息对您可用。

即使您只希望特定方法发生这种情况,jvm 仍然必须跟踪所有方法调用,因为它不知道最终是否调用了要跟踪的方法之一。因此,无法在不影响性能的情况下轻松跟踪方法调用。我所知道的可以将性能影响保持在合理水平的工具,如 XRebel,用于以后的评估,而不是用于编程消费。

换句话说:挂起情况的唯一解决方案是:

  • 进行线程转储并对其进行分析
  • 在您的代码 运行 时进行广泛的 logging/tracing 分析以防万一或挂起

需要说明的是:您所要求的是在事后不可能获得已执行代码的堆栈跟踪!