- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我仍在尝试了解持续存在的问题,但它几乎可以概括为无法卸载 AppDomain。
它发生在将 ASP.NET WebAPI 部署到 Azure 应用服务期间,我们观察到以下情况:
"In w3wp_12396.dmp, the HttpRuntime for the application /LM/W3SVC/1523308129/ROOT is in the middle of a shutdown."
分析内存转储时,我们看到设置了 IsAbortRequested 标志的线程,但它们似乎永远不会完成(此处 WinDbg !threads
的输出: https://pastebin.com/7CXYcffy )
在内存转储中,我们还看到许多具有“UNLOAD_REQUESTED”阶段的 AppDomain,它们似乎从未完成卸载(!DumpDomain
的完整输出位于此处:https://pastebin.com/kahZQuWN)
Domain 7: 000001c67062c800LowFrequencyHeap: 000001c67062cff8HighFrequencyHeap: 000001c67062d088StubHeap: 000001c67062d118Stage: UNLOAD_REQUESTEDSecurityDescriptor: 000001c6705c5680Name: /LM/W3SVC/1523308129/ROOT-6-131687140950004974
No deadlocks detected (via WinDbg SOSEX plugin's !dlk
command at least, which usually covers majority of deadlock cases)
No code cancels Thread Abort (no Thread.ResetAbort()
called)
The only way we can fix the problem now is to kill process (stop Azure AppService).
What are the possible reasons for AppDomain's inability to unload?
UPDATE. In the thread stacks we got a hint that it might have something to do with our custom Azure Blob Log4net appender, and I found that when such appender is created (once per app) it spawns new thread with following structure.
while (true)
{
try
{
Flush(); // pseudocode
Thread.Sleep(10000);
}
catch(Exception)
{
}
}
不确定我理解为什么它会导致完全不可停止的线程(因为 ThreadAbortException
不会被 catch 停止),但看起来像是将 while (true)
更改为 while (!Environment.HasShutdownStarted && !_stopping)
解决了问题(调用 Appender OnClose
时设置 _stopping
,这对 log4net 来说是一种优雅的关闭)...
最佳答案
这似乎是一个 JIT 错误。是的,JIT 中的错误!我发现那里记录了几乎相同的故事:http://labs.criteo.com/2017/04/ryujit-never-ending-threadabortexception/ .
为了演示该问题,您可以运行以下代码。仅适用于 Release模式,仅适用于 x64 平台(并且我的目标是 .NET 4.5.2)。
除非您手动重新抛出异常,否则您将观察到记录的异常链。为什么这是 CLR/JIT 中的错误?因为 CLR/JIT 负责在设置线程的 AbortRequested 标志时在“安全位置”注入(inject) throw ThreadAbortException
。
引用 Jeffrey Richter 的“CLR via C#”(以下代码违反了规定):
Even when code catches the
ThreadAbortException
, the CLR doesn’t allow the exception to be swallowed. In other words, at the end of the catch block, the CLR automatically rethrows theThreadAbortException
exception.
还有 GitHub 中的错误:https://github.com/dotnet/coreclr/issues/16122 .
static void Main(string[] args)
{
var mutex = new ManualResetEventSlim();
var t = new Thread(() =>
{
while (true)
{
try
{
if (!mutex.IsSet)
{
mutex.Set();
}
// Do some stuff
Thread.Sleep(100);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
// the lines below FIX the issue
//if (ex is ThreadAbortException)
// throw;
}
// FIXES the issue as well
//Thread.Sleep(0);
}
});
t.Start();
// Wait for the thread to start
mutex.Wait();
t.Abort();
Console.ReadLine();
}
关于.net - AppDomain 卸载卡住的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50028901/
我正在我的 xamarin.forms 应用程序中实现扫描仪功能,为此我正在使用 iOS native AVCaptureSession。但我的问题是在扫描或捕获 session 处于事件状态并且设备
所以我目前正在为我的项目制作一个音乐应用程序,它允许用户创建自己的音乐播放列表。但是,当我单击显示媒体选择器按钮时,它只显示白屏,当包含媒体选择器的 View 是 Initial View Contr
当我尝试在模拟器中启动 AVD 时,会出现一个小窗口(见图片),5 秒后它说没有响应并一直保持这种状态直到我关闭它。 我在网上搜索并尝试了所有解决方案,但都没有成功 在 BIOS 中启用了虚拟化 已安
尝试使用以下命令从视频中提取特定帧(删除了文件的特定名称!: ffmpeg -i video.mp4 -vf "select-gte(n\,6956)"-vframes 10262 文件夹/帧%d.j
我怎么知道终端正在继续工作而不中断它? 我已经运行了以下 git 命令: clone git://ligo-vcs.phys.uwm.edu/lalsuite.gituote 一段时间后它似乎被卡住了
我对 WPF 中的数据网格有一个奇怪的问题。我正在为我的应用程序使用 MVVM 模式,并且我的 View 模型实现了 idataerrorinfo 接口(interface)。每当我在添加新行后在我的
我有这个 Excel 文件,当我输入数据时它卡住了。例如,我双击一个单元格,输入数据,然后按“输入”。它会卡住而不是进入下面的细胞。按几次“enter”不会解冻程序,唯一有效的是用鼠标选择另一个单元格
我有线程池的任务队列,每个任务都有卡住锁定其正在使用的所有资源的倾向。并且除非重新启动服务,否则这些无法释放。 ThreadPool 中有没有办法知道它的线程已经被卡住?我有一个使用超时的想法(虽然我
我制作了以下小程序来确定内存是否用于 freeze(X,Goal) 之类的目标回收时 X变得无法访问: %:- use_module(library(freeze)). % Ciao Prolog n
我有一个使用 swing 的简单 java 应用程序。然而,当我执行程序时,框架将会出现,但我无法单击任何地方,并且按钮仅在几秒钟后出现。我对 javas Swing 库非常陌生,所以我可能会丢失一些
我正在尝试创建一个简单的 TCP 客户端服务器应用程序接口(interface)用户可以在按下相应按钮时启动或停止服务器我创建了一个 StartServer 按钮,当用户按下按钮时它应该连接到服务
我正在尝试从 ftp 服务器下载文件,但在检索文件时卡住了。我正在使用 commons-net-3.6.jar 我注意到的事情 当我使用 ftpClient.enterRemotePassiveMod
我正在尝试编写一个函数,该函数将能够找到位于我系统上的可执行文件搜索路径中的任意可执行文件。我遇到了一些输入会导致 SearchPathW 的问题无限期地卡住,我不确定到底发生了什么。 std::op
我的 Nativescript 应用程序的许多页面中都有 RadSideDrawer。主应用程序组件有一个 page-router-outlet并且所有其他页面都通过导航加载到此组件中。带抽屉的页面包
我有一个最小的服务器,它等待客户端连接,然后他启动一个线程,将回复发送回客户端,问题是回复。 这是服务器的代码: int port = 1234; ServerSocket servSock =
我有一个使用 C# 的 WinForms 应用程序。我尝试从文件中读取一些数据并将其插入到数据表中。虽然此操作很忙,但我的表单卡住并且我无法移动它。有谁知道我该如何解决这个问题? 最佳答案 这可能是因
在我们学校最新的项目中,我遇到了一些问题。我想观察新条目的路径,该路径是由文件导向器按钮选择的,但如果我选择任何文件,整个窗口都会卡住...我猜它被卡住,因为调用了“observePath”方法,但我
当我输入一百万作为输入数字时,我的程序卡住了。我该如何解决这个问题? 我尝试将第二个 for 循环分离为第二个函数,但没有成功。 import java.io.*; public class Arra
早上好编译我的应用程序时,我在 Android Studio 上遇到问题。我在构建时没有收到关于 app:transformClassesWithDexBuilderForDebug 的任何输出错误,
我正在使用以下触发器 DELIMITER ; CREATE TRIGGER updateCount AFTER INSERT ON user_info FOR EACH ROW BEGIN UPDA
我是一名优秀的程序员,十分优秀!