检测用于调试的Firebug(或任何其他Web调试器)的时间

时间:2012-08-15 09:25:39

标签: javascript debugging firefox firebug

我有一个Javascript应用程序,它依赖于捕获textarea中的键盘事件。在使用firebug(1.10.2)在Firefox(14.x)上测试和调试它时,我发现当我的断点处于活动状态且调试器工作正常时,我的应用程序的行为会有所不同。

我知道如何检测Firebug但是我想知道当Firebug实际用于调试时是否可以检测(使用Javascript)?

编辑:以下是一些随机网站上的示例

This site在输入框中捕获键事件,打印出字符代码并用文本表示替换按下的键(即输入键为“enter”)或大写字母(如果是字母)。 / p>

当我使用Chrome调试它并在侦听器函数上放置一个断点时,到达断点时没有任何反应(正如预期的那样),当我恢复脚本时,文本将正常打印出来。

当我在Firefox上使用Firebug进行调试时:让我们说之前我按下“e”字母,输入栏包含文本“E”。我打开断点并按下字母“z”。 Firebug在断点处停止,但输入栏现在有文本“Ez”而不是“E”。当我恢复脚本时,此文本将按预期替换为“Z”。

我尝试了另一个Firefox调试器(Venkman 0.9.89)并且发生了同样的事情。所以我的猜测是这是一个Firefox问题,而不是调试器问题。所以问题可能更一般,是否可以检测到Javascript代码何时被调试?

2 个答案:

答案 0 :(得分:2)

这就是我检测Firebug的方法:

if (window.console && (window.console.firebug || window.console.exception)) {
  // At this point, Firebug is enabled
}

第一个测试对于确保控制台实际存在很重要第二个测试将测试Firebug,尽管它只适用于它的旧版本。第三个是因为Firebug添加了“异常”这是因为属性“异常”是由Firebug的插件添加的。

(不相关但感兴趣:window.console.exception是Firebug用于在控制台上显示消息的方法。例如,键入:

>>> window.console.exception("A message", {param:'Value'})

您将看到一个看起来非常熟悉的错误,转储传递的对象!

Merc的。

答案 1 :(得分:0)

嗯,希望这个答案对某人有帮助。

让我们调试的函数如:

function debugged()
{
   debugger;
}
setTimeout(debugged, 3000);

添加此调试检测代码为:

setTimeout(this.x = function(a){ s = Math.abs(new Date() - a.c - 1000); a.c = new Date(); setTimeout(a.foo,1000, a); if(s>100)console.log("debug") },1000, {c: new Date(), foo:this.x})

因此,如果我们在某个地方运行它并打开调试器,它将触发断点并且将捕获调试事件(您可以通过控制台中出现的“debug”字来看到它)。这是一个概念,您可以更改检测周期时间和提高调试标志的方法。感谢单线程javascript。