为什么dotmemory在尝试连接到实时进程时无法收集内存流量和堆栈跟踪信息

gfa*_*fan 7 memory profiling

我有一个asp.net应用程序,在应用程序可以提供服务之前,它需要构建一个非常大的本地缓存.我想描述一下代码的特定部分.我的应用程序非常庞大,我不想完全分析它.我只想分析服务请求的代码路径.

我开始用来dotMemory跟踪我的应用内存使用情况.当我尝试附加到进程时,

对话框中两个复选框的profiler选项:1)收集每个第N个对象2)收集内存流量无法检查.

dotMemory尝试连接到实时进程时,为什么无法收集内存流量和堆栈跟踪信息?

我也尝试使用profiler API.

private void SomeMethod()
{
    // Here goes your code
    // ...

    // Get a snapshot
    if (MemoryProfiler.IsActive)
        MemoryProfiler.Dump();
}
Run Code Online (Sandbox Code Playgroud)

我可以获得一个快照,但应用程序首先运行,然后在此之后关闭探查器.我也无法获得内存流量.

Ed.*_*ard 4

这是微软profiling api的限制。应在分析进程启动之前设置标志 COR_PRF_ENABLE_OBJECT_ALLOCATED。

如果您无法在 dotMemory 下启动应用程序,我建议您在“时间轴”模式下尝试 JetBrains dotTrace。它使用 ETW 提供程序来收集内存流量统计信息,并且可以帮助您解决问题。

ps 当您使用分析 api 时,如果您想收集堆栈跟踪,请不要忘记调用 MemoryProfiler.EnableAllocations。

编辑:由于版本 2021.3 dotMemory 还支持使用 Windows ETW 收集分配数据,因此即使将探查器附加到已运行的进程也可以获得它。