Трассировка стека в Flash / ActionScript 3.0 в

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

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

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

спасибо!

8 ответов


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

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

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


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


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

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


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


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

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

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


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

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


начиная с Flash 11.5, трассировки стека работают в версии Flash.

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

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


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

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

образец теста: https://gist.github.com/pipeno/03310d3d3cae61460ac6c590c4f355ed