如何使用 IIS 中托管的服务调试启动异常?
How to debug startup exceptions with service hosted in IIS?
我在 IIS 中有我的服务 运行。我在启动时发生并登录了非致命异常。
如何将 Visual Studio 附加到 IIS,以便它也能调试启动?
我知道我可以将 visual studio 附加到 w3wp.exe
以在其 运行 时进行调试。
将以下内容添加到您的应用程序的启动代码中:
System.Diagnostics.Debugger.Break();
命中此行时,系统将提示您将调试器附加到进程。有关详细信息,请参阅 Debugger.Break。
如果您想进行实时调试,您必须在网络服务器上安装 Remote Debugging tools。确保使用正确的 Visual Studio 版本 运行ning.
在调试模式下编译您的项目,确保在“高级预编译设置”中选中 "Emit debug information"。
将您的项目部署到服务器。 visual studio 中的代码必须与您部署的代码完全匹配,这一点至关重要。不要尝试针对代码中的微小差异进行调试(web.config 设置差异是可以的)。
运行 使用管理员帐户在服务器上使用远程调试工具。你应该看到它说“...等待新连接”。
在 visual studio 中,使用“调试”菜单中的“附加到进程”来附加到服务器上的 w3wp 进程。确保限定符是远程工具正在侦听的 server name
:port number
。
在某些情况下,您可能需要单击附加到进程 window 和 select 中的 "Select..." 按钮仅 "Managed (v4.5, v4.0)" 代码类型,而不是让它自动确定代码类型。如果你的断点因为没有加载符号而永远不会被击中,这可能就是原因。
提示:为您的 IIS 应用程序分配一个特定的应用程序池,以便在附加到进程中更容易识别 window。您可能有一堆 w3wp.exe 个进程,您可能不知道要附加到哪个进程。
作为实时调试的替代方法,您可以 运行 服务器上的 intellitrace,将跟踪文件带回 visual studio 并像记录会话一样单步执行代码。这是涉及 powershell 的另一套指令集。如果可以的话,我更喜欢实时调试。
更新:
要进入 Application_Start()
,回收应用程序池,然后在任何请求进入之前附加 Visual Studio,以确保您(或任何人)发出第一个请求时正在调试。
您也可以使用下面的代码片段。它同样方便 -
System.Diagnostics.Debugger.Launch();
无论何时将其放入代码中,它都会在该位置启动 Visual Studio 的 JIT 调试器,如下所示。正如接受的答案中已经建议的那样,您可以将此代码放在应用程序的启动代码中的第一行:
然后您可以选择并附加到您机器上安装的所有版本的 Visual Studio 的任何新的或已经 运行 的实例。希望这对某人有所帮助!
我在 IIS 中有我的服务 运行。我在启动时发生并登录了非致命异常。
如何将 Visual Studio 附加到 IIS,以便它也能调试启动?
我知道我可以将 visual studio 附加到 w3wp.exe
以在其 运行 时进行调试。
将以下内容添加到您的应用程序的启动代码中:
System.Diagnostics.Debugger.Break();
命中此行时,系统将提示您将调试器附加到进程。有关详细信息,请参阅 Debugger.Break。
如果您想进行实时调试,您必须在网络服务器上安装 Remote Debugging tools。确保使用正确的 Visual Studio 版本 运行ning.
在调试模式下编译您的项目,确保在“高级预编译设置”中选中 "Emit debug information"。
将您的项目部署到服务器。 visual studio 中的代码必须与您部署的代码完全匹配,这一点至关重要。不要尝试针对代码中的微小差异进行调试(web.config 设置差异是可以的)。
运行 使用管理员帐户在服务器上使用远程调试工具。你应该看到它说“...等待新连接”。
在 visual studio 中,使用“调试”菜单中的“附加到进程”来附加到服务器上的 w3wp 进程。确保限定符是远程工具正在侦听的 server name
:port number
。
在某些情况下,您可能需要单击附加到进程 window 和 select 中的 "Select..." 按钮仅 "Managed (v4.5, v4.0)" 代码类型,而不是让它自动确定代码类型。如果你的断点因为没有加载符号而永远不会被击中,这可能就是原因。
提示:为您的 IIS 应用程序分配一个特定的应用程序池,以便在附加到进程中更容易识别 window。您可能有一堆 w3wp.exe 个进程,您可能不知道要附加到哪个进程。
作为实时调试的替代方法,您可以 运行 服务器上的 intellitrace,将跟踪文件带回 visual studio 并像记录会话一样单步执行代码。这是涉及 powershell 的另一套指令集。如果可以的话,我更喜欢实时调试。
更新:
要进入 Application_Start()
,回收应用程序池,然后在任何请求进入之前附加 Visual Studio,以确保您(或任何人)发出第一个请求时正在调试。
您也可以使用下面的代码片段。它同样方便 -
System.Diagnostics.Debugger.Launch();
无论何时将其放入代码中,它都会在该位置启动 Visual Studio 的 JIT 调试器,如下所示。正如接受的答案中已经建议的那样,您可以将此代码放在应用程序的启动代码中的第一行:
然后您可以选择并附加到您机器上安装的所有版本的 Visual Studio 的任何新的或已经 运行 的实例。希望这对某人有所帮助!