我在.net框架分析器中想知道,ExceptionThrow(https://learn.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/icorprofilercallback-exceptionthrown-method)是否保证不会与GC重叠?
查看文档,它似乎是这样 - "如果探查器在此处阻止并尝试垃圾回收,则运行时将阻止,直到此回调返回">
但是,我运行了附加到 paint.net(https://www.getpaint.net/- 版本 4.1.6)的分析器,并看到了在 ExceptionThrow 期间获得 GC 的特定情况。(但这是非常罕见的 - 仅在启动时发生,并且大约每 20 次运行中仅发生一次) - 这导致数据在我读取它时发生变化,因为 gc 移动了它。
至少在 .net 核心版本中 -https://github.com/dotnet/coreclr/blob/master/Documentation/botr/profiling.md 它明确说明了哪些回调是 GC 标注安全的。ExceptionThrow不是其中之一。例如,ExceptionUnwindFunctionEnter 是。但是,回到.NET framework(https://learn.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/icorprofilercallback-exceptionunwindfunctionenter-method)在.NET Framework文档中关于GC的评论与ExceptionThrown相同。
我知道.NET core!= .NET framework。但是,我觉得他们的分析器的代码非常相似,并且具有相同的保证。我找不到有关 .NET 框架回调的 GC 安全性的类似资源。
所以在所有这些介绍之后,我的问题是:
-
.NET Framework clr profiler ExceptionThrow 回调是否为 GC 安全。如果是这样,我怎么会看到 GC 调用在 ExceptionThrow 期间开始和结束(可能是 clr 中的错误或预期行为)?
-
如果没有错误,我是否可以至少 100% 依赖 .NET 框架 clr 分析器 UnwindExceptionFunctionEnter 回调是基于 core-clr 的类似文档的 GC-安全的?
感谢
是的,GC 可以运行。 这。NETCore 接口与 .NETFramework界面,github文档是准确的。
当您查看 CLR 源时,很容易看到。 虽然测试人员似乎一直在鲍尔默峰作业,但他的合同断言必须是准确的。 复制/粘贴相关代码:
// Preemptive mode would be bad, dude. There's an objectId in the param list!
MODE_COOPERATIVE;
MODE_COOPERATIVE
宏指示已启用 GC。MODE_PREEMPTIVE
宏表示 GC 已延迟。