StackTrace в Flash / ActionScript 3.0

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

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

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

Спасибо!

[UX] Категории и настройки внешнего вида Flash-сообщений
[UX] Категории и настройки внешнего вида Flash-сообщений
Flash-сообщение - это обычный веб-элемент, используемый для отправки короткого сообщения пользователю. Например, на странице входа в систему может...
37
0
21 938
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

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

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

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

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

Lucas Gabriel Sánchez 29.09.2008 19:51

Я хочу, чтобы это было отлажено, а не до выпуска, так что в этом нет никаких проблем. И еще раз спасибо.

Lucas Gabriel Sánchez 29.09.2008 20:32

Это не единственный способ. Смотрите мой ответ ниже.

Joony 18.10.2010 22:55

Спасибо, Джуни, я пояснил свой ответ, сказав "сделать трассировку доступной для вашего собственного кода" вместо "получить след".

hasseg 19.10.2010 14:42

Без лишних хлопот вы можете просто написать: var stackTrace:String = (new Error()).getStackTrace(); или даже trace("stack trace: " + (new Error()).getStackTrace());.

iND 31.03.2012 10:04

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

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

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

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

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

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

Начиная с Flash 11.5, трассировка стека работает в окончательной версии Flash.

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

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

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

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

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

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

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

Другие вопросы по теме