有没有办法在不使用Firebug的情况下查看Firefox中执行的JavaScript的痕迹?

时间:2010-01-28 23:19:59

标签: javascript ajax firefox dojo firebug

更新:感谢您的回复。为了澄清,我并不是真的在寻找一个记录器,而是更多的调试器/跟踪器 - 我希望转储每个执行的JavaScript以及执行时。我今天早些时候尝试过Venkman,但它不是很稳定。我的理论是Dojo代码甚至Firefox代码都存在问题。

这仅发生在Firefox 3.5 - 3.6 禁用Firebug (或刚刚未安装)时。

基本上,我正在使用dojo.io.bind在Dojo 0.4.3(我知道!)中发送一个AJAX请求(现已弃用!)。如果你熟悉,那就是使用dojo.io.XMLHTTPTransport作为传输。现在,它的工作方式基本上是它发送XHR,然后有一个名为startWatchingInFlight的观察器函数,每10ms调用一次,以检查XHR的readyState属性。当属性为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
  }
}

现在,这是有趣的部分!如果我在上面取消注释这两个警告,当执行此代码时,我只会得到一个警告:“正在观看...”。在第一次调用watchInFlight之前的10ms内发生了一些事情,导致无法调用它。 (编辑:我也使用了日志语句而不是警报来达到同样的效果。)

所以,我需要的是一种跟踪JavaScript线程的方法,以查看阻止第一次调用watchInFlight的内容。但是,如果你有解决上述问题的方法,我也会接受。

限制:我不能使用另一个库,除非你能用它来与 Dojo 0.4.3 玩得很好(我想我只是在我嘴里吐了一点。 ..我在开玩笑。道场一直都是一个很好的图书馆。)

非常感谢任何帮助。

8 个答案:

答案 0 :(得分:3)

全部谢谢你的回答。 Venkman最终成为我用来逐步完成代码的工具,并让我了解问题所在。或者,相反,。对于那些感兴趣的人,我的问题是由Firefox错误引起的:496087。也可能涉及此错误:501501。在Firefox 3.0.10 +中的帧之间使用时,看起来setTimeout和setInterval有点坏了。

Venkman非常方便,但有点不稳定。我偶尔会得到错误,表示执行堆栈中缺少数据。

答案 1 :(得分:2)

查看Javascript stacktrace library以便为所有浏览器执行此操作:)

答案 2 :(得分:1)

我不确定您发布的代码是否完全复制了您的问题,但无论如何您都有错字!

第一行中的

dojo.io.XMLHttpTransport与第6行中的dojo.io.XMLHTTPTransport不同。请注意,HTTP与Http的字母大小写不同。

因此,在执行超时评估时浏览器会失败,以确定要运行的函数。这就解释了为什么你没有看到任何错误信息...虽然,我希望它在启用firebug时也会失败。我唯一能想到的是firebug以某种方式影响了本机firefox js代码的执行方式eval

答案 3 :(得分:0)

这只是一个快速响应,但根据情况发出警报可能会让事情变得更糟。警报阻止代码执行。我建议不要使用警报,如果某种形式的调试程序是不可能的,请在页面上运行它并为自己设置一个纯HTML控制台进行输出。

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

代替警报,运行一个简单的函数,如:

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

由于代码非常小,只需在您自己的伪堆栈跟踪中写入:

log("entering watchInFlight.");

IMO,警报非常适合立即反馈,除非涉及异步网络请求。在这些情况下,必须使用浏览器调试器或本土记录器。

答案 4 :(得分:0)

iirc,alert就像一个yield,在对话框出现时启用其他事件,因此它会改变你试图调试的代码的时间

答案 5 :(得分:0)

我们使用Blackbird,效果非常好。

答案 6 :(得分:0)

Aptana IDE有一个与firefox一起使用的浏览器调试器机制。因此,如果您可以正确设置它的来源,它可能让您从eclipse进行调试。请注意,它会为firefox安装一个插件。

答案 7 :(得分:0)

Firefox 3.5和3.6启用了Javascript JIT。在页面上使用Firebug时,JSD会禁用JIT,以便您可以有效地进行调试。因此,第一步是在about:config javascript.options.jit.content上更改JIT设置。如果安装了Firebug,您还可以尝试将“脚本”标记从“已启用”更改为“已禁用”。我建议你在继续之前先消除这种可能性。