Есть ли канонический способ распечатать трассировку стека в Perl 6?

В perl 5 я бы использовал любую из функций Carp. В Perl 6 поиск не помогал, и прагма трассировки напечатает все стеки а не только тот, который мне нужен. Я мог использовать только старый прием: выбросить исключение, поймать его и распечатать:

try {
    X::AdHoc.new(payload => 'Stack').throw;
    CATCH { when X::AdHoc { .say; } }
}

Или, будучи немного ленивым:

{
    die;
    CATCH { default { .say } }
}

Как правильно это сделать?


person piojo    schedule 15.08.2017    source источник


Ответы (1)


Я действительно нашел ответ, когда писал этот вопрос, и решил опубликовать его здесь, поскольку он не отображался ни в одном из моих предыдущих поисков. Класс Backtrace Perl 6 получит трассировку стека и преобразует ее в строку:

say "Stack: " ~ Backtrace.new;

(Используйте Backtrace.new.full, чтобы увидеть некоторые дополнительные низкоуровневые фреймы стека, которые обычно скрыты.)

person piojo    schedule 15.08.2017
comment
@ChristopherBottoms Вот и все. Backtrace.new.Str отображает текущую трассировку стека в виде строки. Зарегистрируйте, сохраните, проанализируйте. (Но если бы вы его разбирали, вы бы не вызывали .Str. Вы получили бы доступ к другим методам объекта Backtrace.) - person piojo; 16.08.2017
comment
Ох, ладно. Вы просто хотите проверить трассировку стека в определенном месте вашего кода, не вызывая на самом деле исключения. - person Christopher Bottoms; 16.08.2017
comment
@ChristopherBottoms Справа, например, чтобы получить общее представление о том, почему функция вызывается дважды. Обычно для отладки, а не для ведения журнала производства. - person piojo; 16.08.2017