- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
现在,我很奇怪地遇到了一个错误。
我的应用程序是一个Winform客户端,需要使用WCF连接到服务器。我的应用程序将引用几个.net和c++模块/dll。
由于某种原因,我在代码中设置了ThreadPool.SetMaxThreads(150, 200)
。运行几个小时后,该客户端将与服务器断开连接。
用windbg调试后,我发现线程池中已经充满了许多奇怪的线程。因此,无法在线程池中创建新线程,而且我认为WCF也无法创建线程与服务器连接,从而导致断开连接。
这些奇怪的线程如下所示:
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt
XXXX 3 cb8 0043afd8 1400 Preemptive 00000000:00000000 003f3248 0 Ukn
SetupUnstartedThread
方法和
CreateNewThread/CreateNewOSThread
方法。
SetupUnstartedThread
之后,CLR将创建一个这样的线程
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt
XXXX 3 0 0043afd8 1400 Preemptive 00000000:00000000 003f3248 0 Ukn
0x1400 (TS_Unstarted | TS_WeOwn)
状态且没有OSID且没有调试器ID(XXXX)
CreateNewThread/CreateNewOSThread
之后,该线程将变为
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt
XXXX 3 cb8 0043afd8 1400 Preemptive 00000000:00000000 003f3248 0 Ukn
ExposedObject
字段为null。
ntdll!LdrInitializeThunk
,该线程将获得调试器ID(2)
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt
2 3 cb8 0043afd8 1400 Preemptive 00000000:00000000 003f3248 0 Ukn
(c) a special OS thread in CLR which might run managed code.
SetupThread
方法,该方法将运行以下代码
// reset any unstarted bits on the thread object
FastInterlockAnd((ULONG *) &pThread->m_State, ~Thread::TS_Unstarted);
FastInterlockOr((ULONG *) &pThread->m_State, Thread::TS_LegalToJoin);
0x1400
~
线程列表中都没有相应的线程。因此,您无法在
!runaway
中看到它们
clr!ThreadpoolMgr::CreateWorkerThread
周期性,这将创建一个新的clr线程对象和一个新的os线程对象。
0:004> k
ChildEBP RetAddr
04c8f6f8 6f3ea8ff KERNEL32!CreateThreadStub
04c8f744 6f3ea77b clr!Thread::CreateNewOSThread+0xba
04c8f78c 6f3eabc1 clr!Thread::CreateNewThread+0xa9
04c8f81c 6f4a6aed clr!ThreadpoolMgr::CreateUnimpersonatedThread+0xbb
04c8f83c 6f4a560e clr!ThreadpoolMgr::CreateWorkerThread+0x19
04c8f864 6f4a4457 clr!ThreadpoolMgr::EnsureEnoughWorkersWorking+0x116
04c8f94c 75973c45 clr!ThreadpoolMgr::GateThreadStart+0x431
04c8f958 771a37f5 KERNEL32!BaseThreadInitThunk+0xe
04c8f998 771a37c8 ntdll!__RtlUserThreadStart+0x70
04c8f9b0 00000000 ntdll!_RtlUserThreadStart+0x1b
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt
XXXX 3 cb8 0043afd8 1400 Preemptive 00000000:00000000 003f3248 0 Ukn
ntdll!LdrInitializeThunk
和
ntdll!_RtlUserThreadStart
。
0:065> k
ChildEBP RetAddr
1d54f7c0 75973c45 clr!Thread::intermediateThreadProc
1d54f7cc 771a37f5 KERNEL32!BaseThreadInitThunk+0xe
1d54f80c 771a37c8 ntdll!__RtlUserThreadStart+0x70
1d54f824 00000000 ntdll!_RtlUserThreadStart+0x1b
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt
65 3 cb8 0043afd8 1400 Preemptive 00000000:00000000 003f3248 0 Ukn
clr!Thread::intermediateThreadProc
的参数后,我发现此线程将调用
clr!ThreadpoolMgr::WorkerThreadStart
。
clr!ThreadpoolMgr::WorkerThreadStart
结束后,通常应由
Finalizer线程调用
clr!ThreadStore::RemoveThread
,然后再终止线程。
但是这次没有。
clr!ThreadStore::RemoveThread
,只有
0:065> k
ChildEBP RetAddr
1889fb04 7716f73a ntdll!LdrpCallInitRoutine+0x14
1889fba8 7716f63b ntdll!LdrShutdownThread+0xe6
1889fbb8 75973c4c ntdll!RtlExitUserThread+0x2a
1889fbc4 771a37f5 KERNEL32!BaseThreadInitThunk+0x15
1889fc04 771a37c8 ntdll!__RtlUserThreadStart+0x70
1889fc1c 00000000 ntdll!_RtlUserThreadStart+0x1b
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt
XXXX 3 cb8 0043afd8 1400 Preemptive 00000000:00000000 003f3248 0 Ukn
clr!ThreadpoolMgr::WorkerThreadStart
。因此,我无法给您答案,但我也再次阅读了
SSCLI 2.0 source code,并再次进行了猜测(^ _ ^)。
clr!ThreadpoolMgr::WorkerThreadStart
将调用'clr!SetupThreadPoolThreadNoThrow'。以下是“clr!SetupThreadPoolThreadNoThrow”的代码段。
EX_TRY
{
pThread = SetupThreadPoolThread(typeTPThread);
}
EX_CATCH
{
if (pHR)
{
*pHR = GET_EXCEPTION()->GetHR();
}
}
EX_END_CATCH(SwallowAllExceptions);
clr!SetupThreadPoolThread
。再次显示代码段。
if (NULL == (pThread = GetThread()))
{
pThread = SetupInternalThread();
}
if ((pThread != NULL) && ((pThread->m_State & Thread::TS_ThreadPoolThread) == 0))
{
if (typeTPThread == WorkerThread)
{
FastInterlockOr((ULONG *) &pThread->m_State, Thread::TS_ThreadPoolThread | Thread::TS_TPWorkerThread);
}
else if (typeTPThread == CompletionPortThread)
{
FastInterlockOr ((ULONG *) &pThread->m_State, Thread::TS_ThreadPoolThread | Thread::TS_CompletionPortThread);
}
else
{
FastInterlockOr((ULONG *) &pThread->m_State, Thread::TS_ThreadPoolThread);
}
}
clr!SetupInternalThread
时是否发生了异常,线程的状态将没有机会被更改。
最佳答案
SSCCE用于分析线程
若要查看.NET如何创建托管线程并将其标记为XXX,可以运行以下代码。在调试版本中编译应用程序,启动WinDbg并在调试器下运行该应用程序。在初始断点处,运行以下命令:
sxe -c ".loadby sos clr;g" ld clr.dll;.ocommand OCOMMAND;g
Step .NET threads Unstarted Dead Thread objects Native threads
1 (before started) 2 0 0 1 4
2 (Thread started) 3 1 (XXX) 0 2 5
3 (Thread running) 3 0 0 3 8
4 (Thread ended) 3 0 1 (XXX) 2 7
5 (GC ran) 3 0 1 (XXX) 2 4
using System;
using System.Diagnostics;
using System.Threading;
namespace ManagedThreadDebug
{
class Program
{
static void Main()
{
InformDebug("Before creating thread object.");
var t = new Thread(ThreadRun);
InformDebug("After creating thread object and calling Start().");
t.Start();
InformDebug("While thread is running.");
t.Join();
InformDebug("After thread was running (GC potentially not run yet).");
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
Thread.Sleep(10);
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
Thread.Sleep(10);
InformDebug("After thread was running (GC hopefully ran).");
}
private static void ThreadRun()
{
Thread.Sleep(1000);
}
private static void InformDebug(string message)
{
Console.WriteLine(message);
Trace.WriteLine("OCOMMAND .echo >>> "+message+";!threads;.echo;!dumpheap -stat -type Thread;.echo;~;g");
}
}
}
>>> Before creating thread object.
ThreadCount: 2
UnstartedThread: 0
BackgroundThread: 1
PendingThread: 0
DeadThread: 0
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
0 1 1074 00441310 2a020 Preemptive 02796F48:00000000 00408378 1 MTA
2 2 1fb8 00411258 2b220 Preemptive 00000000:00000000 00408378 0 MTA (Finalizer)
Statistics:
MT Count TotalSize Class Name
69f02e64 1 52 System.Threading.Thread
. 0 Id: b78.1074 Suspend: 1 Teb: 7efdd000 Unfrozen
1 Id: b78.2194 Suspend: 1 Teb: 7efda000 Unfrozen
2 Id: b78.1fb8 Suspend: 1 Teb: 7efd7000 Unfrozen
3 Id: b78.1500 Suspend: 1 Teb: 7efaf000 Unfrozen
>>> After creating thread object and calling Start().
ThreadCount: 3
UnstartedThread: 1
BackgroundThread: 1
PendingThread: 0
DeadThread: 0
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
0 1 1074 00441310 2a020 Preemptive 02797334:00000000 00408378 1 MTA
2 2 1fb8 00411258 2b220 Preemptive 00000000:00000000 00408378 0 MTA (Finalizer)
XXXX 3 0 00474900 1400 Preemptive 00000000:00000000 00408378 0 Ukn
Statistics:
MT Count TotalSize Class Name
69f02e64 2 104 System.Threading.Thread
. 0 Id: b78.1074 Suspend: 1 Teb: 7efdd000 Unfrozen
1 Id: b78.2194 Suspend: 1 Teb: 7efda000 Unfrozen
2 Id: b78.1fb8 Suspend: 1 Teb: 7efd7000 Unfrozen
3 Id: b78.1500 Suspend: 1 Teb: 7efaf000 Unfrozen
4 Id: b78.27d8 Suspend: 1 Teb: 7efac000 Unfrozen
>>> While thread is running.
ThreadCount: 3
UnstartedThread: 0
BackgroundThread: 1
PendingThread: 0
DeadThread: 0
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
0 1 1074 00441310 2a020 Preemptive 02797550:00000000 00408378 1 MTA
2 2 1fb8 00411258 2b220 Preemptive 00000000:00000000 00408378 0 MTA (Finalizer)
6 3 1d04 00474900 2b020 Preemptive 00000000:00000000 00408378 1 MTA
Statistics:
MT Count TotalSize Class Name
69f02e64 2 104 System.Threading.Thread
. 0 Id: b78.1074 Suspend: 1 Teb: 7efdd000 Unfrozen
1 Id: b78.2194 Suspend: 1 Teb: 7efda000 Unfrozen
2 Id: b78.1fb8 Suspend: 1 Teb: 7efd7000 Unfrozen
3 Id: b78.1500 Suspend: 1 Teb: 7efaf000 Unfrozen
4 Id: b78.27d8 Suspend: 1 Teb: 7efac000 Unfrozen
5 Id: b78.2478 Suspend: 1 Teb: 7efa9000 Unfrozen
6 Id: b78.1d04 Suspend: 1 Teb: 7efa6000 Unfrozen
7 Id: b78.1fdc Suspend: 1 Teb: 7efa3000 Unfrozen
>>> After thread was running (GC potentially not run yet).
ThreadCount: 3
UnstartedThread: 0
BackgroundThread: 1
PendingThread: 0
DeadThread: 1
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
0 1 1074 00441310 2a020 Preemptive 027977FC:00000000 00408378 1 MTA
2 2 1fb8 00411258 2b220 Preemptive 00000000:00000000 00408378 0 MTA (Finalizer)
XXXX 3 0 00474900 39820 Preemptive 00000000:00000000 00408378 0 Ukn
Statistics:
MT Count TotalSize Class Name
69f02e64 2 104 System.Threading.Thread
. 0 Id: b78.1074 Suspend: 1 Teb: 7efdd000 Unfrozen
1 Id: b78.2194 Suspend: 1 Teb: 7efda000 Unfrozen
2 Id: b78.1fb8 Suspend: 1 Teb: 7efd7000 Unfrozen
3 Id: b78.1500 Suspend: 1 Teb: 7efaf000 Unfrozen
4 Id: b78.27d8 Suspend: 1 Teb: 7efac000 Unfrozen
5 Id: b78.2478 Suspend: 1 Teb: 7efa9000 Unfrozen
7 Id: b78.1fdc Suspend: 1 Teb: 7efa3000 Unfrozen
>>> After thread was running (GC hopefully ran).
ThreadCount: 3
UnstartedThread: 0
BackgroundThread: 1
PendingThread: 0
DeadThread: 1
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
0 1 1074 00441310 2a020 Preemptive 02797380:00000000 00408378 1 MTA
2 2 1fb8 00411258 2b220 Preemptive 00000000:00000000 00408378 0 MTA (Finalizer)
XXXX 3 0 00474900 39820 Preemptive 00000000:00000000 00408378 0 Ukn
Statistics:
MT Count TotalSize Class Name
69f02e64 2 104 System.Threading.Thread
. 0 Id: b78.1074 Suspend: 1 Teb: 7efdd000 Unfrozen
1 Id: b78.2194 Suspend: 1 Teb: 7efda000 Unfrozen
2 Id: b78.1fb8 Suspend: 1 Teb: 7efd7000 Unfrozen
3 Id: b78.1500 Suspend: 1 Teb: 7efaf000 Unfrozen
sxe ct;sxe et
关于.net - 是什么会导致这么多未启动的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24666604/
每当我运行命令以将 Virtualbox 驱动程序启动 Minishift 到操作系统主机时,它都需要一段疯狂的时间,而且它永远不会结束。有时我什至收到有关达到存储限制的错误消息。 不知道是不是描述h
您好,我正在使用 npm 运行一个基本的 React 项目,我正尝试在 docker 容器中启动它。但是我实际上无法让项目运行。我的 dockerfile 看起来像这样: FROM node:7.8.
所以我想从我的 SSH 终端开始游戏。 这真的很奇怪,当我直接从 Linux GUI 执行此操作时,它可以工作。但是当我使用 SSH 客户端进行远程连接时,它就崩溃了。似乎与我的显示驱动程序有关。 U
我有一个显示图像的动态壁纸。我在 Activity 中更改了该图像。然后我需要通知动态壁纸,以便它知道重新加载资源。 Intent 似乎是完美、简单的解决方案: Intent intent = new
我有一个似乎无法解决的问题。我在 Boot Dashboard 中使用 STS 3.9.2 从 Eclipse (Oxygen) 启动 Spring Boot 应用程序没有任何问题: 但是,当我尝试从
全新的 Python,在我开始摆弄东西之前先设置和安装东西。我的理解是 Python 2.7 和 Python 3.3 之间存在一些显着差异/不兼容,尽管这两个版本都得到了很好的使用,所以我认为最好安
在使用了很长时间的 jQuery 之后,我有一个问题,我正在使用 jQuery 模式(样式)编写一个简单的代码, (function(window, undefined) { var jQu
我正在尝试在 spring boot 应用程序下的非 spring 托管类中配置 Autowired。我在 tomcat 服务器下部署的 Web 应用程序下成功运行了这个。但是当我想在 spring
我对 xmonad 完全陌生,但我想开始使用它来提高我的工作效率。 这是我一直在使用的指南(我使用的是 Apple OS X Snow Leopard) http://xmonad.org/tour.
我试图将Spring Boot指南中的Managing Transactions示例扩展到两个数据源,但是@Transaction注释似乎仅对其中一个数据源有效。 在“Application.java
conEmu 有没有办法默认打开多个不同的选项卡? 我看到这个页面解释了如何使用 splits , 我意识到我可以按 Ctrl + T, 1, Enter,但我希望有一种方法可以自动执行此操作! "%
我正在寻找快速而肮脏的答案。我当时脑子一片空白,盯着屏幕看了 12 个小时以上,我想我中枪了。 我想做一个简单的 SignalR 应用程序作为教程。我找到了这个example ,但我不断收到票证未定义
我正在使用 Azure Powershell cmdlet 来启动/停止 VM。 Start-AzureVM [-ServiceName] [-Name] [ ] Stop-AzureVM [-S
我想使用Powershell脚本代码启动/停止iis和mssql 意味着当我运行ps脚本时,我想启动/停止iis和mssql 我在网上搜索了它,发现了一些代码,但按照我的要求无法正常工作 码: $ii
我在 liferay 工作。我们在我们的项目中使用一个模块来创建 liferay 主题。我使用命令 ant -Ddeploy.war=true 将它部署在服务器中。 war 文件在 liferay 部
我想在已安装 Python 2.7 的 Windows XP 计算机上运行 IPython(版本 0.12)。 我通过 Windows 二进制安装程序安装,但安装后 IPython 没有显示在菜单中,
我从创建了自己的简单图片。 FROM python:2.7.11 RUN mkdir /extra/later/ \ && mkdir /yyy 现在,我可以执行以下步骤: docker run
$(document).ready(function () { setTimeout(function() { window.location.reload(); }, 2000); // 2
我刚刚创建了一个帐户 OpenWeatherMap 我想通过城市 ID API 调用获取当前位置的天气: http://api.openweathermap.org/data/2.5/weather?
我注意到,如果我更改 xcasset 中的图像,启动 Storyboard不会更新。 例如,假设您的启动 Storyboard中有一个 UIImage View ,其中包含一个名为“logo”的蓝色图
我是一名优秀的程序员,十分优秀!