我正在使用 PerfMonitor.exe ( http://bcl.codeplex.com/wikipage?title=PerfMonitor ) 来追踪使用一些第三方库的 .NET 4.0 应用程序的一些 .NET 性能问题,其中一些是本机代码.
当我运行 Perfmonitor GCTime 报告时,它会列出各个 GC 并以多种方式对它们进行分类。报告中的一列称为“原因”。一些 GC 有 Reason="Induced",而另一些有 Reason="SmallAlloc"。
我假设标记为“SmallAlloc”的 GC 是由常规分配(New Object())引起的,而标记为“Induced”的 GC 是由调用“System.GC.Collect”引起的。如果您认为我做出了不正确的假设,请告诉我。
我试图找到调用 System.GC.Collect 的代码,但我没有成功。使用 MSVS 2010 Professional,我在 System.GC.Collect 中设置了一个断点,并通过编写一个包含对 System.GC.Collect 调用的简单测试函数来确保该断点正常工作。但是,我正在调整的应用程序并没有在那个断点处中断,这让我相信没有任何代码调用 System.GC.Collect。
我在想也许有本机代码通过直接调用 mscorwks.dll 中的本机函数并绕过 System.GC.Collect 来引发 GC。我看到 System.GC.Collect 在 mscorwks 中的 JitHelpers.cpp 中调用了 _Collect。有没有办法在该函数中设置断点?