【问题标题】:Detect when is Firebug (or any other web-debugger) used for debugging检测 Firebug(或任何其他 Web 调试器)何时用于调试
【发布时间】:2012-08-15 09:25:39
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 这是一个非常奇怪的要求。您的应用程序的行为有何不同?也许您应该解决并修复您的应用程序的行为,而不是尝试解决它——它在被调试时通常不应该有不同的行为,而且它背后可能存在架构问题。那么那里的许多其他调试器呢?你必须把它们全部检测出来......
  • 即使您没有断点或与非 Firebug 运行的其他差异,当 Firebug 工作时,它的工作方式是否有所不同?
  • 我正在捕获事件、处理它并阻止它。在调试完成工作的方法时,事件实际上发生在我的方法被调用之前,因此我无法阻止它。由于我的应用程序在 Firebug 关闭时工作,我认为这种行为不是 Firefox 问题。我没有找到另一个调试器,谢谢你的想法!此外,虽然 Firebug 已打开但未调试,但一切正常。
  • 任何最小的代码重现都会非常有帮助。尽量减少重现怪癖的代码量也将帮助您更好地理解正在发生的事情。 Ad Firebug,它在调试异步代码时效果不佳。如果你在某个地方停止调试器,同时有活动的setTimeout 被调用,Firebug 不会冻结时钟。请参阅此处了解更多信息:stackoverflow.com/a/11834880/245966

标签: javascript debugging firefox firebug


【解决方案1】:

这是我为检测 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'})

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

佣兵。

【讨论】:

  • 正如我在问题中提到的,我知道这项检查。无论如何谢谢!由于 Firebug 开发人员从 window.console 中删除了 firebug 对象,因此有人会遇到问题,并且可能会发现此答案很有用。
  • 我在您的问题中没有看到对window.console.exceptionwindow.console.firebug 的引用!但是,我可能是个盲人。如果您认为它回答了问题,请接受我的回答!
  • 我的问题是如何检测实际的调试过程,而不是 Firebug 的存在。
  • 对。除了 Chrome 的开发控制台和 Firebug,你还知道多少?
  • 我不确定我是否正确理解了您的问题,我猜您是在问是否还有其他网络调试器?当然还有其他的,例如用于 Firefox 的 Venkman 调试器。
【解决方案2】:

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

让我们调试的函数如下:

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    相关资源
    最近更新 更多