如题, windows7环境下开发, 昨天刚拉了1.8-release的引擎, 模拟器调试每次chrome连上马上就会被断开.

趁着连上的时候关闭了几个脚本貌似又OK了…莫名其妙, 请先忽略吧
1.7.0遇到同样的问题,确实关闭几个脚本就好了,莫名其妙的。
发现关闭project.js 就好。打开这个文件就断开了
我也被惊到了,这跟打开文件有啥关系。。。
同样被惊到,但现象的确是真的,背后肯定有更深层次的原因。正在为不能调试project.dev.js而苦恼中…
1.7.0, Win32 Debug版本
是的, 我这边项目也是, 有两个很大的js文件不能打开, 打开就断.
同一个项目的同事有30%碰到这个问题…
有人解决了这个问题不?
发现当打开project.js时,chrome发过来的WebSocket数据包,inspector解析出错导致的:
调用堆栈:

出错的地方:
出错返回后,inspector关闭了连接:
猜测可能是Chrome版本升级后,某些行为和现在版本的insepctor不一致造成的。

Creator 1.7.0
这个是有可能的。你能帮忙确认一下回退到低版本能用么?比如 chrome 62。
如果是高版本引起的问题,我们得考虑为inspector升级一回。
初步查明,是有由于insepctor不支持大的Websocket数据包造成的。chrome发过来一个很大的数据包,大概有13万个字节那么大(工程里面确实有大文件),发过来的是个json(,json中含有代码,并且json被分为多个包发送过来的)。
按照Websocket规范:
0Bit:
FIN 结束标识位,如果FIN为1,代表该帧为结束帧(如果一条消息过长可以将其拆分为多个帧,这时候FIN可以置为0,表示后面还有数据帧,服务器需要将该帧内容缓存起来,待所有帧都接收后再拼接到一起。控制帧不可拆分为多帧
但是decode_frame_hybi17函数遇到FIN为0时,直接返回了FRAME_ERROR:
bool final = (first_byte & kFinalBit) != 0;
bool reserved1 = (first_byte & kReserved1Bit) != 0;
bool reserved2 = (first_byte & kReserved2Bit) != 0;
bool reserved3 = (first_byte & kReserved3Bit) != 0;
int op_code = first_byte & kOpCodeMask;
bool masked = (second_byte & kMaskBit) != 0;
*compressed = reserved1;
if (!final || reserved2 || reserved3) //不支持final为false的情况
return FRAME_ERROR; // Only compression extension is supported.
同时,遇到kOpCodeContinuation时也返回了FRAME_ERROR
4~7Bit:
opcode 操作码,用于标识该帧负载的类型,如果收到了未知的操作码,则根据协议,需要断开WebSocket连接。操作码含义如下:
0x00 连续帧,浏览器的WebSocket API一般不会收到该类型的操作码
0x01 文本帧,最常用到的数据帧类别之一,表示该帧的负载是一段文本(UTF-8字符流)
0x02 二进制帧,较常用到的数据帧类别之一,表示该帧的负载是二进制数据
0x03-0x07 保留帧,留作未来非控制帧扩展使用
0x08 关闭连接控制帧,表示要断开WebSocket连接,浏览器端调用close方法会发送0x08控制帧
0x09 ping帧,用于检测端点是否可用,暂未发现浏览器可以通过何种方法发送该帧
0x0A pong帧,用于回复ping帧,暂未发现浏览器可以发送此种类型的控制帧
0x0B-0x0F 保留帧,留作未来控制帧扩展使用
bool closed = false;
switch (op_code) {
case kOpCodeClose:
closed = true;
break;
case kOpCodeText:
break;
case kOpCodeBinary: // We don't support binary frames yet.
case kOpCodeContinuation: // We don't support binary frames yet.
case kOpCodePing: // We don't support binary frames yet.
case kOpCodePong: // We don't support binary frames yet.
default:
return FRAME_ERROR;
}
这里不支持kOpCodeContinuation
刚下载了nodejs的最新代码,发现这个函数仍然没有修改。
看来只能自己手动修改这里的代码,让他支持分包数据了。
可能nodejs 认为,让一个文件有很多代码,不是好的组织形式,所以直接不支持调试

