如何在没有UserInteractive模式的情况下进行调试(例如,服务)

时间:2019-03-29 11:06:06

标签: c# visual-studio debugging visual-studio-2017 windows-services

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

我有一个要调试的正在运行的服务,但是其行为因我正在调试还是运行该服务而异。

我发现了这个问题:

How do I debug Windows services in Visual Studio?

那里的答案对我来说还不是很好,因为在调试之后,调试器将在UserInteractive模式下运行该进程。我想要的是调试器,用于调试过程,但没有UserInteractive模式。

例如,我有一个错误被深深地隐藏在代码中,因为它使用的库试图显示某种对话框(即使用户看不到该对话框)。由于使用了UserInteractive模式,因此无法在Debug中进行选择。我希望能够对此类问题进行更多调试

2 个答案:

答案 0 :(得分: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-services/how-to-start-services

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

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

  6. 在菜单栏上,从“调试”或“工具”菜单中选择“附加到进程”,然后按CTRL + ALT + P

出现过程对话框

  1. 然后选中“所有用户的显示过程”复选框

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

希望这会有所帮助

答案 1 :(得分:0)

我讨厌从Visual Studio附加到进程。它可以工作,但似乎还需要花费很多时间才能建立可供选择的过程列表。也许是因为我们的系统锁定得太紧了。完全有可能在不同的环境中工作正常。

不过,我发现仅在服务启动时触发编程断点并在开始时跳入调试要容易得多。为此,请在OnStart()回调中调用以下代码:

System.Diagnostics.Debugger.Break();

启动服务时,您将得到一个提示,指示发生了未处理的异常。

enter image description here

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

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

HTH