6

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

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

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

该站点在输入框中捕获键事件,打印出字符代码并将按下的键替换为文本表示(即“输入”表示输入键)或大写字母(如果是字母)。

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

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

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

4

2 回答 2

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'})

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

默克。

于 2012-08-17T00:36:35.917 回答
1

好吧,希望这个答案对某人有所帮助。

让我们调试的函数如下:

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})

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

于 2014-11-18T13:16:11.463 回答