AspNetCore应用程序在生产中泄漏线程 - 如何调试?

时间:2017-11-28 17:10:11

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

我有一个泄露线程的ASP.NET Core 2应用程序。如何确定线程永不死的原因?

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

enter image description here

几乎所有线程都停留在以下本机堆栈跟踪中:

  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
  16. 除了我的网络应用程序正在泄漏线程之外,这些本机堆栈跟踪并没有告诉我什么。虽然Process Explorer可以显示完整.NET框架应用程序的.NET堆栈跟踪,但它并没有向我展示.NET Core应用程序的.NET堆栈跟踪。

    那么,如何调试此类问题?

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

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

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

1 个答案:

答案 0 :(得分:1)

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

在Visual Studio中连接到此应用程序后,我能够暂停并检查线程。我看到他们正在等待数据库资源。这开启了另一个问题,但对于这个特定的StackOverflow问题,这是一个偏离主题的问题。

我打算将此标记为已解决。这里的课程是你可以使用Remote Debugger + Visual Studio Threads窗口来解释线程泄漏问题。