Как получить правильную трассировку стека вместо трассировки стека отражения? - PullRequest
1 голос
/ 20 июля 2011

У меня большой проект red5, и кажется, что в какой-то момент выполняется функция.Я попытался найти в своем коде, почему эта конкретная функция выполняется в тот момент, и я не смог ее найти.Я хочу выяснить, что его вызывает.

Я прочитал ответы в stackoverflow и обнаружил следующее, чтобы показать информацию трассировки стека текущей позиции.

    StackTraceElement[] elements = Thread.currentThread().getStackTrace();
    for (int i=0;i<elements.length;i++) {
        log.error(elements[i].toString());
    }

и получил следующееoutput:

java.lang.Thread.getStackTrace(Thread.java:1479)
component.lobby.LobbyMysql.getChallenges(LobbyComponentMysql.java:76)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.commons.beanutils.BeanMap.get(BeanMap.java:390)
org.red5.io.amf.Output.writeObject(Output.java:357)
org.red5.io.object.Serializer.writeObjectType(Serializer.java:300)
org.red5.io.object.Serializer.writeComplex(Serializer.java:140)
org.red5.io.object.Serializer.serialize(Serializer.java:86)
org.red5.io.amf.Output.writeObject(Output.java:357)
org.red5.io.object.Serializer.writeObjectType(Serializer.java:300)
org.red5.io.object.Serializer.writeComplex(Serializer.java:140)
org.red5.io.object.Serializer.serialize(Serializer.java:86)
...

Я получаю имя выполняемой функции, но верхние уровни по некоторым причинам являются классами отражения.Есть ли способ узнать фактический метод, который вызывает эту конкретную функцию?

Я не Java и размышления, поэтому, пожалуйста, потерпите меня:)

спасибо

1 Ответ

1 голос
/ 20 июля 2011

Очевидно, что «фактический» код - это , использующий отражение, так что именно это вы и увидите в трассировке стека.

Если вы можете запустить код в режиме отладки, используйте точку останова вместо печати трассировки стека. Когда достигается точка останова, посмотрите, что происходит в стеке вызовов приостановленного потока, в частности, около этого уровня:

java.lang.reflect.Method.invoke(Method.java:597)
...