当应用程序在不同用户下运行时,如何在 Linux 上远程调试 C#/.Net 应用程序?

Posted

技术标签:

【中文标题】当应用程序在不同用户下运行时,如何在 Linux 上远程调试 C#/.Net 应用程序?【英文标题】:How remote debug C#/.Net app on Linux when the app is run under a different user? 【发布时间】:2020-07-31 12:59:49 【问题描述】:

我在 Linux (Ubuntu) 上运行 .Net Core 微服务,并尝试通过 SSH 使用 Visual Studio 进行远程调试。但是该服务在用户svcuser 下运行,而我的用户是mainuser。主用户与服务用户在同一组中。

在 Visual Studio 中,我可以看到服务正在运行的进程,但是当我尝试附加时,我得到:

发生了一个或多个错误。无法附加到进程。 .Net 调试器没有足够的权限来调试进程。要调试此进程,vsdbg 必须以 root 权限运行。

我查看了 MS 文档,但对于 Linux,他们所拥有的只是:https://docs.microsoft.com/en-us/visualstudio/debugger/remote-debugging-dotnet-core-linux-with-ssh?view=vs-2019,其中没有关于使用其他用户运行服务的信息

他们关于解决此类问题的唯一信息仅适用于 Windows:https://docs.microsoft.com/en-us/visualstudio/debugger/error-the-microsoft-visual-studio-remote-debugging-monitor-on-the-remote-computer-is-running-as-a-different-user?view=vs-2019

【问题讨论】:

"要调试此进程,vsdbg 必须以 root 权限运行。" @LexLi 必须有一种没有root权限的方法 你找到解决方案了吗? @NikolaGaić 不,我们最终只是将其限制在我们可以将用户设置为相同的环境中 【参考方案1】:

如果您拥有sudo 权限,那么这相对容易,并且可以保护那些拥有sudo 权限的用户。无需重新配置用户/环境,并允许您调试机器上的任何进程,无论它以哪个用户帐户运行。

如果您使用 Visual Studio 首次尝试调试,您​​会发现在您尝试使用的用户帐户的主目录中创建了一个 ~/.vs-debugger 文件夹。此命令将帮助您找到已安装的 vsdbg 二进制文件。您可以手动安装 VsDbg,但我发现利用自动化过程更容易。如果您使用的是 VSCode,这将成为一个手动过程,并留给读者一个练习,但我仍然会使用 VS2019 IDE 来准备目标,以保持工具之间的一致性。

find ~ | grep vsdbg

对于我的安装,二进制文件位于~/.vs-debugger/vs2019/vsdbg,并且该路径很可能会随着时间而改变。

首先,将二进制文件重命名为方便的名称:

mv ~/.vs-debugger/vs2019/vsdbg ~/.vs-debugger/vs2019/vsdbg-bin

其次,创建一个替换二进制文件的脚本:

touch ~/.vs-debugger/vs2019/vsdbg
chmod 770 ~/.vs-debugger/vs2019/vsdbg
nano ~/.vs-debugger/vs2019/vsdbg

脚本内容可能看起来像这样,注意vsdbg-bin 的完整路径,$@ 的使用确保传递给脚本的所有命令行参数都转发到 VsDbg。

#!/bin/bash
sudo ~/.vs-debugger/vs2019/vsdbg-bin $@

现在从 Visual Studio 重试您的调试会话,如果您操作正确,您应该能够使用 SSH->VsDbg 附加到目标计算机上的任何远程进程。 “在我的机器上工作。” ;) 这已通过 VS2019 16.8.4.NET 5.0VsDbg 16.9.20122.2 调试在 Debian 5.4.8 (x64) 上运行的 ASP.NET Core 应用程序得到证实,该应用程序由 systemd 在 Azure 中的服务用户帐户下启动。 “甜。”

HTH!

【讨论】:

优秀的答案! 真的很好,谢谢

以上是关于当应用程序在不同用户下运行时,如何在 Linux 上远程调试 C#/.Net 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

linux 让程序在后台运行的几种可靠方法

特殊权限

用户态和核心态(转)

gcc在Linux下如何运行一个C/C++程序

linux下的程序如何在windows下运行

安卓多线程间通信和多进程之间通信有什么不同?分别怎么实现?