- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在调试我公司的 CLR 分析器(通过 ASP.NET 4.7.3282.0、.NET 框架 4.7.2),并看到 CLR 卸载泛型类的场景,但 ClassUnloadStarted不调用回调。
简而言之,我们的分析器根据 ClassID 跟踪加载的类,遵循 ClassLoadStarted、ClassLoadFinished 和 ClassUnloadStarted 回调。在某些时候,类会被卸载(连同其相关模块),但不会为相关 ClassID 调用 ClassUnloadStarted 回调。因此,我们留下了一个停顿的 ClassID,认为该类仍在加载。稍后,当我们尝试查询该 ClassID 时,CLR 不出所料地崩溃了(因为它现在指向垃圾内存)。
我的问题,考虑到下面的详细情况:
IComparable(T)
和
T=ClassFromModuleFoo
):
System/IComparable`1<ClassFromModuleFoo>
System/IComparable'1(ClassFromModuleFoo)
, mscorlib,已加载。 ClassFromModuleFoo
,模块 Foo,被加载到程序集 #1。 IComparable
和 ClassFromModuleFoo
再次加载,这次是在程序集 #2 中。现在每个类有两个实例:一个在 Foo 中加载到程序集 #1 中,另一个在 Foo 中加载在程序集 #2 中。 ClassUnloadStarted
为 ClassFromModuleFoo
调用回调在装配#1中。 ClassUnloadStarted
是 不是 要求 System/IComparable'1(ClassFromModuleFoo)
程序集#1 之后的任何时候(即使它的模块已卸载并且它的 ClassID 指向现在被颠簸的内存)。 COR_PRF_DISABLE_ALL_NGEN_IMAGES
禁用了原生图像到探查器事件掩码,认为它可能会影响 ClassLoad* 回调,但它没有任何区别。我验证了 mscorlib.dll
在确实加载而不是其 native 图像。 Loop/MyGenList`1<System/String>
namespace Loop
{
public class MyGenList<T>
{
public List<T> _tList;
public MyGenList(List<T> tList)
{
_tList = tList;
}
}
class MyGenericTest
{
public void TestFunc()
{
MyGenList<String> genList = new MyGenList<String>(new List<string> { "A", "B", "C" });
try
{
throw new Exception();
}
catch (Exception)
{
}
}
}
}
最佳答案
在 .Net Core 中实现它之后(3.0 之前不支持卸载),我们设法复制了它(感谢 valiano!)。 coreclr 团队 (https://github.com/dotnet/coreclr/issues/26126) 确认这是一个错误。
从davmason的解释:
There are three separate types involved and each callback is only giving you two (but a different set of two).
Plugin.MyGenList1: the unbound generic type Plugin.MyGenList1 : the generic type bound to thecanonical type (used for normal references) Plugin.MyGenList1 : the generic type bound to System.String. For ClassLoadStarted we have logic that that specifically excludes unbound generic types (i.e. Plugin.MyGenList1) from being shown to the profiler in ClassLoader::Notify
This means you ClassLoadStarted only gives you callbacks for the canonical and string instances. This seems the right thing to do here, since as a profiler you would only care about bound generic types and there's nothing of interest for unbound ones.
The issue is that we do a different set of filtering for ClassUnloadStarted. That callback occurs inside EEClass::Destruct, and Destruct is only called on non-generic types, unbound generic types, and canonical generic types. Non-canonical generic types ( i.e. Plugin.MyGenList1 ) are skipped.
关于.net - 没有为泛型类调用 ICorProfilerCallback::ClassUnloadStarted,即使该类已卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54883986/
我是一名优秀的程序员,十分优秀!