Подтвердить что ты не робот

StackTrace в Flash/ActionScript 3.0

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

public function PrintStackTrace() {
    try {
        throw new Error('StackTrace');
    } catch (e:Error) {
        trace(e.getStackTrace());
    }
}

Мне нравится знать, есть ли другой способ сделать это. В некотором месте класс Error создает трассировку стека, но, возможно, он не делает этого с ActionScript 3.0, поэтому, возможно, это не возможно, но я хочу знать.

Спасибо!

4b9b3361

Ответ 1

Насколько я знаю, единственный способ сделать трассировку стека доступным для вашего собственного кода - это метод getStackTrace() в Класс ошибок, как и вы уже делаете. Однако в ответ на пример в вашем вопросе я бы упомянул, что на самом деле вам не нужно бросать ошибку - вы можете просто создать ее и вызвать на ней метод:

var tempError:Error = new Error();
var stackTrace:String = tempError.getStackTrace();

Кроме того, как и в документации, это работает только в отладочной версии Flash Player, поэтому вы можете обернуть эту функциональность в if-блоке, который проверяет значение Capabilities.isDebugger, если вы хотите.

Ответ 2

Из Flash Player 11.5 трассировки стека также доступны в версиях без отладчика игроков.

Ответ 3

Используйте Flex DeBugger (FDB), который поставляется вместе с Flex SDK. Это отладчик командной строки, который позволяет вам отлаживать .swf, даже в режиме онлайн (если это версия отладки). Он позволяет устанавливать точки останова, печатать/изменять переменные и удалять стек, а не требует добавления дополнительного кода. Очень полезный инструмент, с которым вы не должны быть!

Параметры fdb, которые вам понадобятся, это "break" и указать класс и строку, где вы хотите остановить выполнение, и "bt" или "info stack", чтобы дать вам обратную трассировку стека. Вы также можете отображать почти все о приложении во время его запуска.

Ответ 4

@hasseg прав. Вы также можете сохранить информацию о стеке в версии выпуска (не отлаживать), предоставив -compiler.verbose-stacktraces = true при компиляции SWF.

Ответ 5

Я собрал эту небольшую функцию:

public static function getStackTrace() : String
{
    var aStackTrace : Array = new Error().getStackTrace().split("\n");
    aStackTrace.shift();
    aStackTrace.shift();
    return "Stack trace: \n" + aStackTrace.join("\n");
}

У меня есть эта функция в обычном классе "Отладка", который я использую с моими приложениями при разработке. Два вызова shift() удаляют первые две строки: первая - это только строка "Ошибка", а вторая строка относится к этой самой функции, поэтому она не полезна. Вы даже можете удалить третью строку, если хотите (она относится к строке, где вы поместите вызов функции getStackTrace()), добавив еще один вызов shift(), но я оставил его, чтобы служить отправной точкой для "стека" след".

Ответ 6

var tempError:Error = new Error();
var stackTrace:String = tempError.getStackTrace();

напишите эту строку stackTrace в любой файл, чтобы вы также могли видеть журналы вашей программы в режиме запуска. Поэтому вам не нужно запускать его только в режиме отладчика. Запишите его в uncaughtexception событие приложения, так что он будет выполняться последним.

Ответ 7

Как и в случае с Flash 11.5, трассировки стека работают в версии версии Flash.

Однако это не означает, что это уже не проблема. Если ваше приложение настроено на использование компилятора старше 11,5 в Flash Builder --> Project properties --> ActionScript Compiler, у вас не будет трассировки стека.

Кроме того, на той же странице вы можете увидеть версию AIR SDK. Если вы используете v3.4 или старше, вы не увидите трассировки стека. Если это ваша проблема, все ваши разработчики должны обновить свой AIR SDK, следуя инструкциям здесь.

Ответ 8

Метод getStackTrace возвращает трассировку стека только на отладочном проигрывателе (https://www.adobe.com/support/flashplayer/debug_downloads.html), на проигрывателе релизов возвращается null. Убедитесь, что у вас установлен и запущен проигрыватель debug.

-compiler.verbose-stacktraces=true добавляет номер строки в трассировку стека отладки.

Пример теста: https://gist.github.com/pipeno/03310d3d3cae61460ac6c590c4f355ed