Есть ли способ увидеть след исполняемого JavaScript в Firefox без использования Firebug? - PullRequest
2 голосов
/ 29 января 2010

Обновление: Спасибо за ответы до сих пор. Чтобы уточнить, я на самом деле не ищу регистратор, а скорее отладчик / трассировщик - Я хочу получить дамп каждого фрагмента JavaScript, который выполнялся и когда он выполнялся . Я попробовал Venkman ранее сегодня, но это не очень стабильно. Моя теория состоит в том, что что-то идет не так в глубине кода Dojo или даже кода Firefox.

Это происходит только в Firefox 3.5 - 3.6 , когда Firebug отключен (или просто не установлен).

По сути, я отправляю запрос AJAX в Dojo 0.4.3 (я знаю!), Используя dojo.io.bind (теперь не рекомендуется!). Если вы знакомы, он использует dojo.io.XMLHTTPTransport в качестве транспорта. Теперь, в основном, он работает так, что отправляет XHR, а затем имеет функцию-наблюдатель startWatchingInFlight, которая вызывается каждые 10 мсек для проверки свойства readyState в XHR. Когда свойство равно 4, оно делает кучу вещей:

dojo.io.XMLHTTPTransport = new function () { /* I know, I know. I would never do this */
  // somewhere in XMLHTTPTransport ...
  this.startWatchingInFlight = function () {
    // alert('watching...');
    if (!this.inFlightTimer) {
      this.inFlightTimer = setTimeout("dojo.io.XMLHTTPTransport.watchInFlight();",10);
    }
  };

  this.watchInFlight = function () {
    // alert('a glance');
    // do a bunch of stuff...
    var tif = foo(); // well, never mind how we get it but it's the object in flight
    // tif.http is the XHR object
    if (4 == tif.http.readyState) {
      // call some stuff
    }
  }

  this.bind = function (args) {
    // somewhere in XMLHTTPTransport.bind ....
    this.startWatchingInFlight();
    http.send(query); // Again, http is the already-opened XHR object
    // and so on
  }
}

Теперь вот самое интересное! Если бы я раскомментировал эти два предупреждения выше, при выполнении этого кода я получил бы только одно предупреждение: «наблюдаю ...». Что-то происходит за 10 мс до первого звонка на watchInFlight, что препятствует его вызову. ( РЕДАКТИРОВАТЬ: Я также использовал операторы регистрации вместо предупреждений о том же эффекте.)

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

Ограничения: Я не могу использовать другую библиотеку, если вы не можете заставить ее играть хорошо с Додзё 0.4.3 (Я думаю, что я просто немного рванул во рту ... Я шучу. Додзё всегда была хорошей библиотекой).

Любая помощь будет принята с благодарностью.

Ответы [ 8 ]

3 голосов
/ 10 февраля 2010

Спасибо всем за ответы. Venkman оказался инструментом, который я использовал для пошагового выполнения кода, и помог мне понять, в чем проблема. Или, скорее, - это . Для тех, кто заинтересован, моя проблема вызвана ошибкой Firefox: 496087 . Эта ошибка также может быть связана: 501501 . Похоже, setTimeout и setInterval немного ломаются при использовании между кадрами в Firefox 3.0.10 +.

Венкман довольно удобен, но немного нестабилен. Иногда я получаю сообщения об ошибках, которые говорят о том, что в стеке выполнения отсутствуют данные.

2 голосов
/ 29 января 2010

Проверьте библиотеку Javascript stacktrace , чтобы сделать это для всех браузеров:)

1 голос
/ 31 января 2010

Я не уверен, что опубликованный вами код является точной копией вашей проблемы, но в любом случае у вас есть опечатка!

dojo.io.XMLHttpTransport в вашей первой строке отличается от dojo.io.XMLHTTPTransport в строке 6. Обратите внимание, что HTTP отличается регистром букв, чем Http.

Таким образом, в браузере происходит сбой при выполнении истечения времени ожидания, чтобы определить, какую функцию запустить. Это объясняет, почему вы не видите никаких сообщений об ошибках ... хотя, я ожидал бы, что это произойдет и при включенном firebug. Единственное, о чем я могу думать, это то, что firebug каким-то образом влияет на то, как работает нативный код firefox js eval.

0 голосов
/ 17 февраля 2010

В Firefox 3.5 и 3.6 JIT включен Javascript. При использовании Firebug на странице JSD отключает JIT, чтобы вы могли эффективно отлаживать. Поэтому первым шагом было бы изменить настройку JIT на about: config javascript.options.jit.content. Если у вас установлен Firebug, вы также можете попробовать изменить тег Script с Enabled на Disabled. Я предлагаю вам сначала исключить эту возможность, прежде чем продолжить.

0 голосов
/ 09 февраля 2010

Aptana IDE имеет механизм отладки браузера, который работает с Firefox. Так что, если вы можете настроить его правильно и ваш источник, он может позволить вам отладить из затмения. Обратите внимание, что он устанавливает плагин для Firefox.

0 голосов
/ 29 января 2010

Мы используем Blackbird , и это работает очень хорошо.

0 голосов
/ 29 января 2010

iirc, оповещение похоже на выход, позволяя другим событиям срабатывать, пока диалоговое окно присутствует, поэтому оно изменит время кода, который вы пытаетесь отлаживать

0 голосов
/ 29 января 2010

Это просто быстрый ответ, но оповещения, в зависимости от ситуации, могут все испортить. Оповещения о выполнении кода блока. Я бы предложил вместо предупреждения, и если какая-то форма отладчика исключена, запустите ее на странице и посвятите себя небольшой чистой HTML-консоли для вывода.

<div id="console"></div>

Вместо предупреждения запустите простую функцию, например:

function log(msg) {
    document.getElementById("console").innerHTML += msg;
}

А так как код довольно маленький, просто напишите в своей собственной трассировке псевдостека:

log("entering watchInFlight.");

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

...