.net - clr profiler api: ICorProfilerCallback::ExceptionThrown GC 是否安全
问题描述
我想知道在 .net 框架分析器中,ExceptionThrown ( https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/icorprofilercallback-exceptionthrown-method ) 是否保证不会与 GC 重叠?
查看文档,它看起来是这样 - “如果探查器在此处阻塞并尝试进行垃圾收集,则运行时将阻塞,直到此回调返回”
但是,我运行了附加到paint.net(https://www.getpaint.net/ - 版本4.1.6)的分析器,并看到了一个在ExceptionThrown期间我得到GC的特定情况。(但这是非常罕见的 - 仅在启动时发生,大约每 20 次运行中仅发生一次) - 这导致数据在我阅读时发生变化,因为 gc 移动了它。
至少在 .net 核心版本中 - https://github.com/dotnet/coreclr/blob/master/Documentation/botr/profiling.md它明确说明了哪些回调是 GC 调出安全的。ExceptionThrown 不是其中之一。例如,ExceptionUnwindFunctionEnter 是。但是,回到 .NET 框架 - https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/icorprofilercallback-exceptionunwindfunctionenter-method - .NET 框架文档中关于 GC 的注释与此相同异常抛出。
我知道 .NET 核心!= .NET 框架。但是,我觉得他们的分析器的代码非常相似并且具有相同的保证。我找不到关于 .NET 框架回调的 GC 安全性的类似资源。
所以在所有这些介绍之后,我的问题是:
.NET 框架 clr 探查器 ExceptionThrown 回调是否应该是 GC 安全的。如果是这样,我怎么会在 ExceptionThrown 期间看到 GC 调用开始和结束(可能是 clr 中的错误或预期的行为)?
如果没有错误,我是否可以至少 100% 依赖 .NET 框架 clr 探查器 UnwindExceptionFunctionEnter 回调是 GC 安全的,基于 core-clr 的类似文档?
谢谢
解决方案
是的,允许 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被延迟了。
推荐阅读
- php - 如何获取数组对象的一部分?
- sql - 使用 case 语句时的 Group By 子句问题
- jquery - 在模态框内清除表单字段
- katalon-studio - 如何单击使用自动化测试新创建的项目?
- javascript - 在 socket.io 中显示房间
- flutter - 如何从 FutureBuilder 或异步代码构建 PreferredSizeWidget,而不是 Widget?
- c# - 一键部署设置需要安装 .NET Framework 4.7.2
- binary - 在c ++中左移一个数字的n个最低有效位的最快方法是什么
- serverless-framework - 有没有办法防止别名在部署时被重置?
- java - 使用 spring-boot 发送的 PDF 邮件附件为空