使用Visual Studio Code调试托管在虚拟机上的Node应用程序

9
我需要一些关于使用Visual Studio Code调试我的应用程序的帮助,我的应用程序位于由Oracle Virtual Box托管的虚拟机中。
虚拟机已经配置了典型的node、express、node-inspector等设置,我能够使用node-inspector调试我的应用程序(即端口已在虚拟机内转发,如果我使用"node --debug-brk app.js"运行我的应用程序,则它监听端口5858,我可以导航到localhost:8080/debug?port=5858开始调试)。
然而,在VSC中,如果我使用调试中的"附加"选项,我根本无法到达断点。
这里有什么特别的东西我错过了吗?还是有任何日志文件我可以查看 - 我在OSX Yosemite上,VM OS在virtual box中运行的是一个无头OpenSuse,使用vagrant提供服务?
注:我尝试在端口5858上通过telnet连接到虚拟机,我得到的响应与本地机器本身不同,如下所示:
虚拟机内部:
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

嵌入式主机:node 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.

任何帮助都将不胜感激?
是的,我正在VM外运行VSCode - VM是无头的。
端口已经配置为在vagrant provisioning脚本内部转发。但是,同事告诉我可能存在一个公司政策,强制实施于我们的网络适配器,从而导致我的连接问题。
然而,我尝试了不同的方法。我通过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和其他代码文件保存在虚拟机上,它们保存在我的本地机器上,并配置了相应的Samba共享。也许这是造成混淆的原因?
4个回答

12

我的 Vagrantfile 将主机映射到 Ubuntu 虚拟机如下:

config.vm.synced_folder "C:/Users/me/Documents/app", "/home/app"

我通过以下步骤使VS Code中的node调试工作:

  1. 在虚拟机中转发端口5858:config.vm.network :forwarded_port, host: 5858, guest: 5858

  2. 在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"
            }
        ]
    }
    
  3. 在虚拟机中: cd /home/app/api

  4. 运行命令:node --inspect=0.0.0.0:5858 server.js

  5. 在VS Code中,打开文件夹C:/Users/me/Documents/app,设置断点并按F5。

如果您可以telnet到端口5858并且从虚拟机内外获取相同的响应,则可能表示文件映射错误。


2
在第4步中,您只需要使用“--debug”或“--debug-brk”中的一个,而不是两者都使用。对于服务器进程,“--debug”可能已经足够了,如果您不想调试服务器的启动序列。 - Andre Weinand
1
在版本1.11.2中,outDir已被弃用。我刚刚将其删除,现在一切都正常了。谢谢! - Jon

5
我已经验证通过ssh隧道转发端口5858可以连接到运行在虚拟机内部的节点,并使用不涉及源代码路径的调试器功能(例如断点和步进事件等)。但是,源代码路径存在问题,因为VSCode需要访问与运行在虚拟机内部的节点相同路径的源文件。即使您通过samba共享源代码,指向文件的绝对路径在虚拟机内部和外部可能不同。对于VSCode Preview,唯一的解决方法是使路径相同,例如通过引入符号链接等方式。我们已经在我们这边创建了一个错误来改善源路径匹配。
- Andre Weinand, Visual Studio Code

请参考 https://code.visualstudio.com/docs/editor/debugging 中的“远程调试 Node.js”部分进行更新。 - Andre Weinand

2

我猜你是在虚拟机之外运行VSCode,类似于从虚拟机之外进行的telnet,因为它无法检测到v8调试协议,所以VSCode将不能附加到端口上。

我认为你需要以某种方式配置你的虚拟机超级监视程序,将5858端口从虚拟机映射到虚拟机主机。

如果从虚拟机之外进行的telnet输出与从虚拟机内部进行的telnet相同,则说明你已经正确完成了这个配置。


谢谢您的快速回复,Alex。我已经更新了问题并包含了我的进展。 - Nicholas Ford

0

这并不复杂,只需通过Virtualbox共享文件夹,在VM的内外两侧共享文件夹,您可以将文件夹在两个操作系统中挂载为永久或临时文件夹。在我的情况下,我使用Windows 10来使用完整的Visual Studio功能,但使用Linux或OSx也可以完成,只需在NIC(网络卡)中进行一些桥接处理。 提示:我使用bitnami,比未知的vagrant存储库更清晰。


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