2012-10-12 4 views
3

Никакой единственный метод в программе «не знает», где он находится в стеке. Все, что он знает, это его собственная маленькая работа, и она делает это и возвращается. Итак, когда вызывается Exception и печатается трассировка стека, откуда это происходит?Как создаются трассировки стека?

Неявно ли отдельный поток работает рядом с каждым приложением в JVM, которое контролирует состояние программы? Или сама JVM хранит эту информацию, и Исключения каким-то образом вытаскивают эти данные из нее, когда их бросают?

Если это так, можно ли использовать какой-либо вызов для извлечения трассировки стека (либо из потока монитора, либо из JVM) без, выбрасывающего исключение?

ответ

5

Каждый поток будет иметь свой собственный stack. Каждый вызов метода создает фрейм стека. Если что-то не так произошло в коде любого метода, который будет распространяться на метод вызывающего. Таким образом, JVM может отслеживать, какой метод генерировал ошибку, и какова иерархия вызовов.

Если вы правильно следите за трассировкой стека, вы увидите метод, в котором произошла ошибка сверху, и иерархия внизу.

Профессор Стэнфорда читает замечательную лекцию, чтобы понять, как она работает. Я бы предложил посмотреть его.

ПРИМЕЧАНИЕ: Это теория. Если вы хотите знать, как работает API, ответ @Peter Lawrey может вам помочь.

+0

Да, меня очень интересует теория. :) Вот почему я задал вопрос, а не для какой-либо конкретной практической цели. – asteri

+0

Хорошо, тогда мой ответ может дать некоторые выводы, и серия видео может заполнить пробелы. – kosa

4

Он исходит из класса Thread, который проходит через код.

Thread.dumpStack(); 

Чтобы увидеть его, вы можете просто:

StackTraceElement[] trace = Thread.currentThread().getStackTrace(); 
    for (int i=0; i < trace.length; i++) 
     System.out.println("\tat " + trace[i]); 
3

Вы можете узнать Нить метод принадлежит используя Thread.currentThread. Используя этот поток, вы можете получить StackTrace, потому что есть стек для каждого потока в JVM. Кроме того, программа main работает в потоке main.

3

Когда вы создаете Throwable (не когда вы его бросаете), он записывает трассировку стека на низкий уровень/скрытый способ, связанный с Throwable. Когда вы вызываете getStackTrace(), первый раз он создает объекты StackTraceElement[] из информации низкого уровня. Это не так лениво, поскольку трассировка стека часто не используется.

Смежные вопросы