附加 Visual Studio 调试器会导致高 CPU 使用率和 UI 线程锁定

Posted

技术标签:

【中文标题】附加 Visual Studio 调试器会导致高 CPU 使用率和 UI 线程锁定【英文标题】:Attaching Visual Studio debugger causes high CPU usage and UI thread locks 【发布时间】:2016-09-03 08:28:35 【问题描述】:

我有一个 WPF 应用程序,它执行一些异步网络(通过 100 个并行套接字进行协商)。如果我启动附加了 VS 调试器的应用程序并启动网络代码,我的 CPU 使用率将跃升至 60%(在 VS、VS 调试器和 vshost 进程之间共享),并且 UI 变得非常无响应,持续冻结长达 3 秒。当我将调试器附加到已经运行的进程时,也会发生同样的情况。在正常情况下它使用 1-3% 的 CPU 并且 UI 很流畅。

“CPU 使用率”模式下的 VS 分析器显示 CPU 被 [外部代码] 使用

如何解决此问题?

【问题讨论】:

在“输出”窗口中查看发生了什么,水晶球表示您看到了 很多 条消息。它们并不便宜。 确实我有很多“抛出异常”消息。有没有办法防止这种情况发生? 异常以大约 30/秒的速度抛出,但这在我的用例中是正常的,它们都被捕获了。 好吧,看起来减速确实是由很大的异常率引起的。我试图删除我的网络代码并用一个异常抛出替换它,但我仍然得到无响应的 UI。我还在输出窗口中禁用了第一次机会异常,但它没有解决问题。调试器是否有一些选项可以停止收集第一次机会异常? 每秒 30 个不太可能是简单的解释。右键单击输出窗口并取消选中“异常消息”以减少开销。接下来使用分析器是明智的。 【参考方案1】:

如果你只是抛出异常,你是如何真正处理这个异常的?

例如,如果客户端将请求发送到服务器端,服务器端将响应发送给客户端,但您的客户端无法真正处理带有一些异常的响应,我认为这会影响您的 UI 流程可能有高 CPU 使用率或其他。

所以真正的原因是异常是什么以及如何真正解决/处理这个异常。

为避免看到该消息,右键单击输出窗口并取消选中“异常消息”是一种解决方法,但找到真正的原因并解决它会是一个更好的解决方案。

【讨论】:

首先,我的应用程序运行良好,没有附加调试器。我使用非常不可靠的网络和服务器,因此我处理网络异常的策略是静默记录它们并重试操作。其中大部分是 TimeoutException 和 SocketException。正如我已经指出的,从输出窗口隐藏异常并不能解决问题。 您是否禁用了 WPF 项目属性中的“启用 Visual Studio 托管进程”选项?貌似你用的是VS profiler工具,你用的是这个CPU工具吗? blogs.msdn.microsoft.com/visualstudioalm/2014/02/28/…,[外部代码]树下有没有项目? 正如我在帖子中已经指出的那样>>“CPU 使用率”模式下的 VS 分析器显示 CPU 被 [外部代码] 使用

以上是关于附加 Visual Studio 调试器会导致高 CPU 使用率和 UI 线程锁定的主要内容,如果未能解决你的问题,请参考以下文章

调试 IIS 时关闭 Visual Studio 附加安全警告

如何在运行时确定您的 C++ 应用程序何时附加了 Visual Studio 调试器?

C++ 从命令行附加 Visual Studio 调试器

Visual Studio 附加到进程调试

Visual studio 附加进程调试

Visual Studio 调试 —— 附加到进程