【问题标题】:clr profiler api: is ICorProfilerCallback::ExceptionThrown GC safeclr profiler api:ICorProfilerCallback::ExceptionThrown GC 是否安全
【发布时间】:2019-08-16 07:13:51
【问题描述】:

我想知道在 .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 的注释与 ExceptionThrown 的注释相同。

我知道 .NET 核心!= .NET 框架。但是,我觉得他们的分析器的代码非常相似并且具有相同的保证。我找不到关于 .NET 框架回调的 GC 安全性的类似资源。

所以在所有这些介绍之后,我的问题是:

  1. .NET 框架 clr 分析器 ExceptionThrown 回调是否应该是 GC 安全的。如果是这样,我怎么会在 ExceptionThrown 期间看到 GC 调用开始和结束(可能是 clr 中的错误或预期行为)?

  2. 如果没有错误,我是否可以至少 100% 依赖 .NET 框架 clr 分析器 UnwindExceptionFunctionEnter 回调是基于 core-clr 的类似文档的 GC 安全的?

谢谢

【问题讨论】:

    标签: .net clr coreclr clr-profiling-api


    【解决方案1】:

    是的,允许 GC 运行。 .NETCore接口与.NETFramework接口没有本质区别,github文档是准确的。

    当您查看the CLR source 时很容易看到。虽然测试员似乎一直在鲍尔默峰工作,但他的合同断言必须是准确的。复制/粘贴相关代码:

        // Preemptive mode would be bad, dude.  There's an objectId in the param list!
        MODE_COOPERATIVE;
    

    MODE_COOPERATIVE 宏表示 GC 已启用。 MODE_PREEMPTIVE 宏表示 GC 延迟。

    【讨论】:

    • 我认为这需要进一步解释:当线程处于 MODE_PREEMPTIVE 时,运行时任何事情都可能发生。 GC 没有延迟。抢占式基本上告诉 CLR 当前线程不以任何方式处理托管对象,因此该线程永远不会阻塞 GC。当线程处于 MODE_COOPERATIVE 时,GC 只能在该线程同意(或触发它)时发生。更多信息请访问github.com/dotnet/coreclr/blob/master/Documentation/…
    • 除此之外,GC确实可以发生——但你可以保证你在回调中收到的ObjectID不会被移动/删除
    猜你喜欢
    • 2013-09-11
    • 2023-03-31
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多