StackTrace во Flash / ActionScript 3.0 - PullRequest
36 голосов
/ 29 сентября 2008

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

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

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

Спасибо!

Ответы [ 8 ]

50 голосов
/ 29 сентября 2008

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

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

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

8 голосов
/ 11 февраля 2013

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

6 голосов
/ 13 октября 2010

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

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

2 голосов
/ 29 марта 2016

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

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 (), но я оставил ее, чтобы она служила отправной точкой стека след».

2 голосов
/ 06 февраля 2012

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

1 голос
/ 25 августа 2014

Начиная с Flash 11.5, трассировка стека работает в выпускной версии Flash.

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

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

1 голос
/ 18 декабря 2013
var tempError:Error = new Error();
var stackTrace:String = tempError.getStackTrace();

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

0 голосов
/ 11 июля 2016

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

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

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

...