使用Visual Studio Code调试VM上托管的节点应用程序

时间:2015-05-08 09:34:11

标签: node.js visual-studio-code

我正在寻找一些使用Visual Studio Code调试我的应用程序的帮助,我的应用程序保存在由Oracle Virtual Box托管的虚拟机中。

已经为VM配置了node,express,node-inspector等的典型设置。我可以使用node-inspector调试我的应用程序(即节点检查器的端口已在vm内转发,如果我设置我的应用程序运行"节点--debug-brk app.js"它侦听端口5858,我可以导航到localhost:8080 / debug?port = 5858开始调试。)

但是在VSC中,如果我使用"附加"调试中的选项我根本无法进入断点。

我在这里缺少什么特别的东西,或者是否有我可以看到的任何日志文件 - 我在OSX Yosemite上,VM OS在虚拟盒中运行是一个无头的OpenSuse,配置了vagrant?< / p>

注意:我已尝试通过端口5858远程登录虚拟机,我从虚拟机内部获得了与本地计算机本身不同的响应,如下所示:

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

VM之外:

telnet 127.0.0.1 5858
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

非常感谢任何帮助?

是的我在VM外部运行VSCode - 虚拟机是无头的。

端口已配置为在vagrant配置脚本中转发。然而,一位同事告诉我,可能有一项公司政策被强制要求我们与我们的网络适配器有关 - 防止/导致我的连接问题。

然而,我尝试了不同的方法。我通过ssh为端口5858上的所有流量隧道连接:

ssh -i myprivatekey -L 5858:localhost:5858 tempuserlocalhost -p 2222 

现在,当我开始调试应用程序(即node --debug app.js)并使用attach选项时,调试器显然会附加。虽然应该这样做,但它并没有在app.js中击中我的断点。

实际上,如果我暂停调试器,我会得到一个局部变量列表和一个调用堆栈,但会显示以下错误:

Error opening 'app.js' (File not found)

注意:app.js和其他代码文件在VM上保持,它们保存在我的本地计算机上,并相应配置了samba共享。也许这会造成混乱?

4 个答案:

答案 0 :(得分:10)

我的Vagrantfile具有从我的主机到Ubuntu VM的以下映射:

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

我通过这样做在VS Code中进行节点调试:

  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. 在VM中:cd /home/app/api
  4. 运行node --debug server.js
  5. 在VS Code中,打开文件夹C:/Users/me/Documents/app,设置断点并按F5。
  6. 如果您可以telnet到端口5858并从VM内部和外部获得相同的响应,则可能意味着文件映射是错误的。

答案 1 :(得分:4)

我已经验证通过ssh对端口5858进行隧道传输到目前为止,您可以连接到在VM内部运行的节点,并使用不涉及源路径的调试器功能(源路径用于断点和步骤事件等。 ) 源路径的问题是VSCode需要访问源文件,其路径与在VM内运行的节点相同。即使您通过samba共享源,导致文件的绝对路径在VM内部和外部之间也可能不同。 VSCode预览的唯一解决方法是使路径相同,例如通过引入(符号)链接等 我在我们这边创建了一个bug来改进源路径匹配。

Andre Weinand,Visual Studio Code

答案 2 :(得分:2)

我猜你在VM之外运行VSCode,因此类似于来自VM外部的telnet,VSCode将无法连接到端口,因为它没有检测到v8调试协议。

我认为您需要以某种方式配置VM虚拟机管理程序,以将5858端口从VM映射到VM主机。

如果来自VM外部的telnet将从VM中输出与telnet相同的内容,您将知道您已正确完成。

答案 3 :(得分:0)

它并不那么复杂,只需通过Virtualbox共享您的文件夹,只需在VM的内部和外部共享文件夹,就可以在两个操作系统中将您的文件夹永久或临时地挂载,在我的情况下,我使用Windows 10进行全屏显示工作室功能,但是可以用linux或OSx完成,只需在NIC(网卡)中做一些桥接即可 提示:我的用户bitnami更加清楚未知的无用信息存储库