Как получить трассировку стека определенной строки программы Java - PullRequest
0 голосов
/ 22 марта 2019

Как получить трассировку стека для успешно выполненной строки в 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)

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

В конце концов, вы просите какое-то оборудование. Другими словами: вы хотите, чтобы jvm отслеживал стек вызовов и, что более важно, делал эту информацию доступной вам программно.

И даже если вы хотите, чтобы это происходило только с конкретными методами, jvm все равно должен отслеживать все вызовы методов, поскольку он не может знать, вызывается ли один из методов для отслеживания в конце. Таким образом, невозможно легко отследить вызовы методов без влияния на производительность. И инструменты, которые я знаю, которые могут поддерживать это влияние на производительность на разумном уровне, такие как XRebel, предназначены для последующей оценки, а не для программного потребления.

Другими словами: единственные решения для зависания ситуаций:

  • делает дамп потока и анализирует его
  • делает обширную запись / трассировку во время работы вашего кода, чтобы проанализировать это в случае или зависает

Просто чтобы прояснить: то, что вы просите, получить трассировку стека уже выполненного кода после того, как факт невозможно достичь!

1 голос
/ 22 марта 2019

Пожалуйста, посмотрите в следующем ответе.

Получить текущую трассировку стека в Java

В основном это Thread.currentThread().getStackTrace()

...