使用 Visual Studio 代码调试托管在 VM 上的节点应用程序
Debugging a node app hosted on a VM using Visual Studio Code
我在使用 Visual Studio 代码调试我的应用程序时寻求一些帮助,我的应用程序保存在 Oracle Virtual Box 托管的虚拟机中。
VM 已经配备了节点、express、节点检查器等的典型设置,我可以使用节点检查器调试我的应用程序(即节点检查器的端口已在 vm 中转发如果我设置我的应用 运行 "node --debug-brk app.js" 它监听端口 5858,我可以导航到 localhost:8080/debug?port=5858 开始调试)。
但是在 VSC 中,如果我在调试中使用 "attach" 选项,我根本无法到达断点。
这里有什么我遗漏的特别的东西吗?有没有我可以查看的日志文件 - 我在 OSX Yosemite 上,虚拟机 OS 是 运行 在 virtual box 中是一个无头的 OpenSuse,配备了 vagrant?
注意:我已经尝试通过端口 5858 远程登录到 VM,但从 VM 内部到本地机器本身得到了不同的响应,如下所示:
虚拟机内部:
telnet 127.0.0.1 5858
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Type: connect
V8-Version: 3.14.5.9
Protocol-Version: 1
嵌入主机:节点 v0.10.32
内容长度:0
虚拟机外:
telnet 127.0.0.1 5858
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
任何帮助将不胜感激?
是的,我 运行 VSCode 在 VM 之外 - VM 是无头的。
端口已配置为在 vagrant 供应脚本中转发。但是,一位同事告诉我,可能有一项与我们的网络适配器相关的公司政策被强加给我们 - preventing/causing 我的连接问题。
但是我尝试了另一种方法。我已经通过 ssh 为端口 5858 上的所有流量建立了隧道连接:
ssh -i myprivatekey -L 5858:localhost:5858 tempuserlocalhost -p 2222
现在,当我开始调试应用程序(即 node --debug app.js)并使用调试器明确附加的附加选项时。它没有在 app.js 中达到我的断点,但它应该在它应该达到的时候。
事实上,如果我暂停调试器,我会得到局部变量列表和调用堆栈,但会显示以下错误:
Error opening 'app.js' (File not found)
注意:app.js 和其他代码文件 不是 保存在 VM 上,它们保存在我的本地计算机上,并相应配置了 samba 共享。也许这是造成混乱的原因?
我猜你 运行 VSCode 在 VM 外部,与你在 VM 外部的 telnet 非常相似,VSCode 将无法连接到端口,因为它未检测到 v8 调试协议。
我认为您需要以某种方式配置 VM 管理程序以将 5858 端口从 VM 映射到 VM 主机。
如果从 VM 外部的 telnet 输出与从 VM 内部的 telnet 输出相同,您就会知道您已经正确完成了。
我已经验证到目前为止,通过 ssh 隧道传输端口 5858 是可行的,您可以连接到 VM 内的节点 运行 并使用不涉及源路径的调试器功能(源路径用于断点和步骤事件等)
源路径的问题是 VSCode 需要访问与 VM 内的节点 运行 具有相同路径的源文件。即使您通过 samba 共享源,指向文件的绝对路径在 VM 内部和外部之间也可能不同。 VSCode 预览的唯一解决方法是使路径相同,例如通过引入(符号)链接等
我已经在我们这边创建了一个错误来改进源路径匹配。
Andre Weinand,Visual Studio代码
我的 Vagrantfile 具有以下从我的主机到 Ubuntu VM 的映射:
config.vm.synced_folder "C:/Users/me/Documents/app", "/home/app"
我通过这样做在 VS Code 中进行了节点调试:
虚拟机转发端口5858:config.vm.network :forwarded_port, host: 5858, guest: 5858
在 VS Code 中,设置如下 launch.json
:
{
"version": "0.2.0",
"configurations": [
{
"name": "Attach",
"type": "node",
"request": "attach",
"port": 5858,
"address": "localhost",
"restart": false,
"sourceMaps": false,
"localRoot": "${workspaceRoot}/api",
"remoteRoot": "/home/app/api"
}
]
}
在虚拟机中:cd /home/app/api
运行 node --inspect=0.0.0.0:5858 server.js
在 VS Code 中,打开文件夹 C:/Users/me/Documents/app
,设置断点并按 F5。
如果你能telnet到5858端口并且从VM内部和外部得到相同的响应,这可能意味着文件映射是错误的。
它并没有那么复杂只需通过 Virtualbox 共享您的文件夹只需在 VM 内外的两侧共享文件夹您可以将您的文件夹安装为永久或临时的文件夹在我的情况下 OS我使用 windows 10 来使用完整的 visual studio 功能,但它可以用 linux 或 OSx 完成,只需在 NIC(网卡)中做一些桥接工作
提示:我的用户 bitnami 更清楚 unknown vagrant repositories
我在使用 Visual Studio 代码调试我的应用程序时寻求一些帮助,我的应用程序保存在 Oracle Virtual Box 托管的虚拟机中。
VM 已经配备了节点、express、节点检查器等的典型设置,我可以使用节点检查器调试我的应用程序(即节点检查器的端口已在 vm 中转发如果我设置我的应用 运行 "node --debug-brk app.js" 它监听端口 5858,我可以导航到 localhost:8080/debug?port=5858 开始调试)。
但是在 VSC 中,如果我在调试中使用 "attach" 选项,我根本无法到达断点。
这里有什么我遗漏的特别的东西吗?有没有我可以查看的日志文件 - 我在 OSX Yosemite 上,虚拟机 OS 是 运行 在 virtual box 中是一个无头的 OpenSuse,配备了 vagrant?
注意:我已经尝试通过端口 5858 远程登录到 VM,但从 VM 内部到本地机器本身得到了不同的响应,如下所示:
虚拟机内部:
telnet 127.0.0.1 5858
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Type: connect
V8-Version: 3.14.5.9
Protocol-Version: 1
嵌入主机:节点 v0.10.32 内容长度:0
虚拟机外:
telnet 127.0.0.1 5858
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
任何帮助将不胜感激?
是的,我 运行 VSCode 在 VM 之外 - VM 是无头的。
端口已配置为在 vagrant 供应脚本中转发。但是,一位同事告诉我,可能有一项与我们的网络适配器相关的公司政策被强加给我们 - preventing/causing 我的连接问题。
但是我尝试了另一种方法。我已经通过 ssh 为端口 5858 上的所有流量建立了隧道连接:
ssh -i myprivatekey -L 5858:localhost:5858 tempuserlocalhost -p 2222
现在,当我开始调试应用程序(即 node --debug app.js)并使用调试器明确附加的附加选项时。它没有在 app.js 中达到我的断点,但它应该在它应该达到的时候。
事实上,如果我暂停调试器,我会得到局部变量列表和调用堆栈,但会显示以下错误:
Error opening 'app.js' (File not found)
注意:app.js 和其他代码文件 不是 保存在 VM 上,它们保存在我的本地计算机上,并相应配置了 samba 共享。也许这是造成混乱的原因?
我猜你 运行 VSCode 在 VM 外部,与你在 VM 外部的 telnet 非常相似,VSCode 将无法连接到端口,因为它未检测到 v8 调试协议。
我认为您需要以某种方式配置 VM 管理程序以将 5858 端口从 VM 映射到 VM 主机。
如果从 VM 外部的 telnet 输出与从 VM 内部的 telnet 输出相同,您就会知道您已经正确完成了。
我已经验证到目前为止,通过 ssh 隧道传输端口 5858 是可行的,您可以连接到 VM 内的节点 运行 并使用不涉及源路径的调试器功能(源路径用于断点和步骤事件等) 源路径的问题是 VSCode 需要访问与 VM 内的节点 运行 具有相同路径的源文件。即使您通过 samba 共享源,指向文件的绝对路径在 VM 内部和外部之间也可能不同。 VSCode 预览的唯一解决方法是使路径相同,例如通过引入(符号)链接等 我已经在我们这边创建了一个错误来改进源路径匹配。
Andre Weinand,Visual Studio代码
我的 Vagrantfile 具有以下从我的主机到 Ubuntu VM 的映射:
config.vm.synced_folder "C:/Users/me/Documents/app", "/home/app"
我通过这样做在 VS Code 中进行了节点调试:
虚拟机转发端口5858:
config.vm.network :forwarded_port, host: 5858, guest: 5858
在 VS Code 中,设置如下
launch.json
:{ "version": "0.2.0", "configurations": [ { "name": "Attach", "type": "node", "request": "attach", "port": 5858, "address": "localhost", "restart": false, "sourceMaps": false, "localRoot": "${workspaceRoot}/api", "remoteRoot": "/home/app/api" } ] }
在虚拟机中:
cd /home/app/api
运行
node --inspect=0.0.0.0:5858 server.js
在 VS Code 中,打开文件夹
C:/Users/me/Documents/app
,设置断点并按 F5。
如果你能telnet到5858端口并且从VM内部和外部得到相同的响应,这可能意味着文件映射是错误的。
它并没有那么复杂只需通过 Virtualbox 共享您的文件夹只需在 VM 内外的两侧共享文件夹您可以将您的文件夹安装为永久或临时的文件夹在我的情况下 OS我使用 windows 10 来使用完整的 visual studio 功能,但它可以用 linux 或 OSx 完成,只需在 NIC(网卡)中做一些桥接工作 提示:我的用户 bitnami 更清楚 unknown vagrant repositories