【问题标题】:AspNetCore app is leaking threads in production - how to debug?AspNetCore 应用程序在生产中泄漏线程 - 如何调试?
【发布时间】:2017-11-28 17:10:11
【问题描述】:

我有一个 ASP.NET Core 2 应用程序正在泄漏线程。我如何确定为什么线程永远不会死?

如果我在生产环境中运行该应用程序 10 分钟,IIS 开始出现 502.3 Bad Gateway 错误。我加载了 Process Explorer 并查看了应用程序->Properties->Threads,我看到线程数不断增加:

几乎所有线程都被以下本机堆栈跟踪卡住:

  1. ntoskrnl.exe!KeWaitForMutexObject+0x8d6
  2. ntoskrnl.exe!KeDelayExecutionThread+0x9a9
  3. ntoskrnl.exe!KeWaitForMutexObject+0x1cf
  4. ntoskrnl.exe!_misaligned_access+0x80d
  5. ntoskrnl.exe!SeAccessCheck+0x280
  6. ntoskrnl.exe!KeDelayExecutionThread+0xb49
  7. ntoskrnl.exe!KeWaitForMutexObject+0x1cf
  8. ntoskrnl.exe!KeWaitForMultipleObjects+0x2ce
  9. ntoskrnl.exe!ObWaitForMultipleObjects+0x29c
  10. ntoskrnl.exe!ObWaitForMultipleObjects+0x713
  11. ntoskrnl.exe!KeSaveStateForHibernate+0x2a33
  12. ntdll.dll!ZwWaitForMultipleObjects+0xa
  13. KERNELBASE.dll!GetProcessHeap+0x62 coreclr.dll+0x4d9c8
  14. coreclr.dll+0x4db61 coreclr.dll!MetaDataGetDispenser+0x55008
  15. System.Private.CoreLib.dll+0x58834c

这些本地堆栈跟踪并没有告诉我太多,除了我的网络应用程序正在泄漏线程。虽然 Process Explorer 可以显示完整 .NET 框架应用程序的 .NET 堆栈跟踪,但它不会显示 .NET Core 应用程序的 .NET 堆栈跟踪。

那么,如何调试这样的问题呢?

我无法在本地开发环境中重现此内容。它似乎与高流量或我的生产服务器环境有关。

到目前为止我尝试过的事情:

  • 在我的应用中启用标准输出日志:没有关于失败的线索。
  • 添加了 AppDomain.UnhandledException 处理程序,写入标准输出。没有线索。
  • 查看了 Windows 事件日志。没有线索。

【问题讨论】:

    标签: debugging asp.net-core asp.net-core-2.0 thread-dump


    【解决方案1】:

    我在我的服务器上setup Remote Debugging 并且能够从我的开发盒连接到处于不健康状态的应用程序。

    在 Visual Studio 中连接到此应用后,我可以暂停并检查线程。我看到他们正在等待数据库资源。这引发了另一个问题,但对于这个特定的 StackOverflow 问题来说,它是题外话。

    我将把它标记为已解决。这里的教训是您可以使用 Remote Debugger + Visual Studio Threads 窗口来阐明线程泄漏问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 2021-04-01
      • 1970-01-01
      • 2012-11-23
      相关资源
      最近更新 更多