0

在 Visual Studio 中调试时是否可以模拟非 UserInteractive 模式,如果可以,如何模拟?

我有一个正在运行的服务,我想调试它,但行为会有所不同,具体取决于我是在调试它还是在运行该服务。

我发现了这个问题:

如何在 Visual Studio 中调试 Windows 服务?

那里的答案对我来说并不完全,因为在此之后,当您调试它时,调试器会在 UserInteractive 模式下运行该进程。我想要的是调试器来调试进程,但没有 UserInteractive 模式。

例如,我有一个深埋在代码中的错误,因为它使用的库试图显示某种对话框(即使用户看不到对话框)。由于使用了 UserInteractive 模式,因此在 Debug 中不会出现这种情况。我希望能够对这类问题进行更多调试

4

2 回答 2

1

要调试服务,您需要

  1. 在调试配置中构建您的服务

  2. 安装您的服务以查看如何执行此操作,请访问此链接https://docs.microsoft.com/en-us/dotnet/framework/windows-services/how-to-install-and-uninstall-services

  3. 从服务控制管理器、服务器资源管理器甚至从代码启动您的服务,如果您想知道如何执行此操作,请转到此链接https://docs.microsoft.com/en-us/dotnet/framework/windows -服务/如何启动服务

  4. 以管理员身份启动 Visual Studio,以便您可以附加到系统进程。

  5. 可选 > 在 Visual Studio 菜单栏上,选择工具、选项。在选项对话框中选择调试符号并选择微软符号服务器复选框,然后选择确定按钮

  6. 在菜单栏上,从调试或工具菜单中选择附加到进程,快捷键按 CTRL+ALT+P

出现进程对话框

  1. 然后选择从所有用户中显示进程复选框

  2. 在可用的流程部分,为您的服务选择流程,然后选择附加

希望这可以帮助

于 2019-03-29T13:12:59.793 回答
0

我讨厌从 Visual Studio 附加到一个进程。它有效,但似乎也需要很长时间才能构建可供选择的进程列表。也许那是因为我们的系统被锁得太紧了。完全有可能在不同的环境中,这工作得很好。

尽管如此,我发现在服务启动时触发程序断点并在开始时跳转到调试要容易得多。为此,请在OnStart()回调中调用以下内容:

System.Diagnostics.Debugger.Break();

当你启动你的服务时,你应该得到一个提示,表明发生了未处理的异常。

在此处输入图像描述

单击“是”选项,对 UAC 提示回答“是”,选择要使用的 Visual Studio 实例,然后在 Visual Studio 启动后正常调试。

完成调试后,只需停止服务,调试器将自动退出。但是,不要关闭该 Visual Studio 实例。进行所需的任何更改以提供服务,然后重新构建它。然后,当您重新启动服务并选择要使用的 Visual Studio 实例时,它将在列表中包含您的原始调试实例。跳回那个比每次创建一个新实例要快得多。

HTH

于 2019-04-11T06:27:13.387 回答