问题:
鉴于node.js对windows的支持还不是很好,特别是npm还未正式支持node.js。希望大家如下所述的node.js开发调试环境:
1. 开发环境基于windows + eclipse
2. node.js运行在linux上
3. eclipse 远程连接node.js进行调试
4. 工程文件通过samba在windows和linux上共享
遇到的问题是eclipse无法远程连接到node.js debugger。
> node --debug app.js
> netstat -a -n | grep tcp | grep LISTEN
发现,node.js的监听地址是 127.0.0.1:5858. 这样windows上运行的eclipse无法连接上来。
要解决这个问题,就需要让node.js debugger监听linux的ip地址。
解决过程:
通过跟踪代码,发现
1. deps/v8/src/platform.h中 Socket::Bind的定义,只接受一个port参数
2. deps/v8/src/platform_posix.h的Socket::Bind实现只监听本地地址,如下
boolPOSIXSocket::Bind(const int port) {
if (!IsValid()) {
return false;
}
sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
addr.sin_port = htons(port);
int status = bind(socket_,
BitCast<struct sockaddr*>(&addr),
sizeof(addr));
return status == 0;
}
3. 修改红色部分代码,监听地址改为INADDR_ANY,如下
4. 重新编译node.js,运行。eclipse可以连接node.js debugger了.
boolPOSIXSocket::Bind(const int port) {
if (!IsValid()) {
return false;
}
sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
addr.sin_port = htons(port);
int status = bind(socket_,
BitCast<struct sockaddr*>(&addr),
sizeof(addr));
return status == 0;
}