Adobe Air, пакетная установка не удалась с моей процедурой трассировки ... как получилось? - PullRequest
0 голосов
/ 31 марта 2010

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

Проблема: происходит сбой в установленном файле AIR. Интересно, почему? Я не ожидаю, что он будет работать как есть ... просто, я бы предпочел, чтобы программа не вызывала сбой!

ТХ Арти

enter code here    

static public function XTRACE( ... traceArgs ):void {
    try {
        throw new Error();  // make a stack
    } catch (e:Error) {
        var stack:String = e.getStackTrace();
        var frames:Array = stack.split("\n");
        var myFrame:String = String(frames[2]);
        myFrame = myFrame.replace("\t", "");

        // "at " can be followed by some part of the package
        // you don't want to see. E.g., if your code is all in
        // com.foo.bar, you can put "at com.foo.bar." so as not
        // to crowd the display
        myFrame = myFrame.substr("at ".length);
        myFrame = myFrame.substring(0, myFrame.indexOf("["));
        var now:Date = new Date();
        trace(new Date().toLocaleTimeString() + ":" + myFrame + ": " + traceArgs.join(" "));
    }
}

Ответы [ 4 ]

0 голосов
/ 04 октября 2010

Я понимаю, что вы, вероятно, состарились и забыли, что такое вспышка, так как вы задали этот вопрос. Но вы получаете NPE, потому что e.getStackTrace () возвращает ноль в проигрывателе релиза.

Пара других вещей:

  1. Вам не нужно выдавать ошибку, чтобы получить трассировку стека; new Error (). getStackTrace () работает нормально.
  2. Так как это отладочный код, а вызывающий код, вероятно, не ожидает ошибок, вы должны обернуть все это в попытку catch.
  3. Компилятор не разрешает «at» .length, поэтому он будет вызываться каждый раз во время выполнения. Если вы действительно не параноик, вы можете просто жестко закодировать его до 3.
  4. Оба субстрата могут быть объединены в 1
  5. Переменная now не используется.
0 голосов
/ 01 апреля 2010

Внутри функции трассировки вы пытаетесь статически вызвать Date (). ToLocaleTimeString () до того, как он будет создан с помощью ключевого слова new . Вместо этого попробуйте следующее:

trace((new Date()).toLocaleTimeString() + ":" + myFrame + ": " + traceArgs.join(" "));
0 голосов
/ 01 апреля 2010

спасибо за ваш вклад Фергал. Функция XTRACE прекрасно работает с проигрывателем отладки и дает сбой только при запуске проигрывателя релиза. Поэтому я предполагаю, что строка кода, которую я использую, должна связывать значения в правильном порядке ... Я остановился на функции, о которой раньше не знал:

enter code here
static public function XTRACE( ... traceArgs ):void {
    if ( Capabilities.isDebugger ) {     

При этом XTRACE ничего не делает, если не выполняется в среде отладки. Так что это работает вокруг проблемы. Я все еще буду использовать твои скобки, но мне нравится, когда порядок ассоциации тоже очевиден; -)

0 голосов
/ 31 марта 2010

Как происходит сбой вашего приложения?

1) Процедуры трассировки предназначены для отладки, поэтому ваша трассировка ничего не сделает в установленном приложении.

2) Я не уверен, когда вы вызываете эту процедуру, но кажется странным, что у вас есть процедура, которая выдает только ошибку. Я думаю, что в этом коде «catch» будет введен только в случае возникновения ошибки. Обычно вы пытаетесь выполнить какое-то полезное действие и ловить ошибки, когда что-то идет не так.

...