Firefox调试器直接跳转到else块,而不是if块

5

我想知道下面展示的序列是如何可能发生的。

以下是相关函数:

WebSocketConnector.prototype.sendMessage = function(message) {
    if (socket !== null) {
        socket.send(message);
        console.log('Sent: ' + message);
    } else {
        alert('Failed to send message. WebSocket connection not established.');
    }
};

以下是函数调用过程中的调试输出结果:

1. 从第32行开始。

if条件

2. 单步进入,执行到第33行。

if块的第一行

3. 再次单步进入,执行到第34行。

if块的第二行

4. 再次单步进入,居然直接跳到第36行???

else块的第一行

--> 怎么可能会出现从if块的最后一行直接跳到else块的第一行的情况呢?

以下是一些重要的事实:

  1. 这里没有漏掉任何步骤。
  2. 这确实发生了。
  3. 我只从一个地方调用了sendMessage,并且记录了调用发生的时间。日志中没有未解释的sendMessage调用,因此我不相信异步是一个解释。
  4. 我还使用Firebug调试器尝试了同样的操作,结果也是一样的。

编辑/后续

如果我在else块的第一行添加一个console.log语句(将alert推迟到第37行),控制流就会从第34行直接跳到第37行(跳过console.log语句)。

另外,我应该提到的是,即使直接进入那段代码,也不会出现任何警报。

编辑2

以下是sendMessage函数的空格和CRLF:

输入图片说明


你的代码在问题、IDE和Firefox调试器中的换行符是否完全相同?也许这是一个与代码在调试器中显示方式不同于在VM中加载且行号不对应的错误相关的bug。 - reverse_engineer
@reverse_engineer,谢谢你的回复,但似乎并不是这样。我确保代码格式正确并重新测试了它,但调试器仍然出现同样的问题。我还检查了MS Word中的文本以查看空格和换行符(CRLFs),但它们都似乎是正确的(请参见我的问题中的Edit 2)。 - devuxer
我刚刚看到了几乎完全相同的事情,当这行代码引发异常时。在异常情况下,它似乎显示为要进入else语句。很奇怪。 - NoBugs
2个回答

3
这是因为调试器会在返回给调用堆栈框架之前跳转到最后一个可执行行。在您的情况下,这是包含alert()函数的第36行。如果调试器跳转到函数的关闭大括号,即第38行,将更清晰明了。
已经有一个报告要改变此行为: https://bugzil.la/1013219

那就是这样了。谢谢! - devuxer

1

不幸的是,Firefox 调试器存在一些非常奇怪的行为。如果您所描述的问题可能与 this bug 相关,我并不会感到惊讶。"步进"功能有时不会按照您的预期或 Chromium 浏览器的预期工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接