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

Posted

技术标签:

【中文标题】使用 Visual Studio Code 调试托管在 VM 上的节点应用程序【英文标题】:Debugging a node app hosted on a VM using Visual Studio Code 【发布时间】:2015-07-19 04:07:21 【问题描述】:

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

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

但是在 VSC 中,如果我在调试中使用“附加”选项,我根本无法到达断点。

我在这里遗漏了什么特别的东西,或者有什么我可以查看的日志文件 - 我在 OSX Yosemite 上,并且在虚拟框中运行的 VM 操作系统是一个无头 OpenSuse,配置有 vagrant?

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

虚拟机内部:

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.

任何帮助将不胜感激?


是的,我在 VM 之外运行 VSCode - VM 是无头的。

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

但是我尝试了不同的方法。我已经通过 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 共享。也许这是造成混乱的原因?

【问题讨论】:

【参考方案1】:

我猜你是在虚拟机外部运行 VSCode,所以类似于你在虚拟机外部的 telnet,VSCode 将无法连接到端口,因为它没有检测到 v8 调试协议。

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

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

【讨论】:

感谢亚历克斯的快速回复。我已更新问题以包括我取得的进一步进展。【参考方案2】:

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

Andre Weinand,Visual Studio 代码

【讨论】:

请参阅code.visualstudio.com/docs/editor/debugging 中的“远程调试 Node.js”部分以获取更新。【参考方案3】:

我的 Vagrantfile 有以下从我的主机到 Ubuntu 虚拟机的映射:

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

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

    在 VM 中转发端口 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内外都得到相同的响应,可能是文件映射错误。

【讨论】:

在第 4 步中。您只需要 '--debug' 或 '--debug-brk' 但不能同时使用两者。对于服务器进程,如果您不想调试服务器的启动顺序,“--debug”可能就足够了。 在 1.11.2 版中,outDir 已弃用。我刚刚删除了它,一切正常。谢谢!【参考方案4】:

它并不复杂,只需通过 Virtualbox 共享您的文件夹,只需在 VM 外部和内部共享文件夹即可,您可以在两个操作系统中将您的文件夹安装为永久或临时文件夹,在我的情况下,我使用 Windows 10 来用户完全可视化工作室功能,但它可以用 linux 或 OSx 完成,只需在 NIC(网卡)中做一些桥接的东西 提示:我的用户 bitnami 比未知的 vagrant 存储库更清楚

【讨论】:

以上是关于使用 Visual Studio Code 调试托管在 VM 上的节点应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio Code 中使用 Makefile 调试现有项目

使用Visual Studio Code调试Electron

使用Visual Studio Code调试Electron

使用Visual Studio Code调试Electron

使用 Visual Studio Code 调试 webpack 捆绑节点 ts

使用 Visual Studio Code 进行调试不起作用