我有以下内容来启动分析API:
while (!MemoryProfiler.IsActive || !MemoryProfiler.CanControlAllocations)
{
_presenter.WriteLine("Press enter to try to attach.");
Console.ReadKey();
Thread.Sleep(250);
}
MemoryProfiler.EnableAllocations();
但是,如果我运行此操作并将dotMemory附加到其中,则MemoryProfiler.CanControlAllocations
始终为false
(MemoryProfiler.IsActive
变为true
)。
如果我让dotMemory启动应用程序,那么它会按预期工作,并且两者都评估为true
。
但是,如果我将while
替换为Console.Read()
和if
,请执行以下操作:
Console.WriteLine("Press enter when connected.");
Console.ReadLine();
if (MemoryProfiler.IsActive && MemoryProfiler.CanControlAllocations)
{
MemoryProfiler.EnableAllocations();
}
然后它工作正常。
发生了什么事? while
循环如何改变这样的行为?
更奇怪的行为
如果我运行以下内容(if
已注释掉)
Console.WriteLine("Press enter when connected.");
Console.ReadLine();
Console.WriteLine($"MemoryProfiler.IsActive: {MemoryProfiler.IsActive}");
Console.WriteLine($"MemoryProfiler.CanControlAllocations: {MemoryProfiler.CanControlAllocations}");
//if (MemoryProfiler.IsActive && MemoryProfiler.CanControlAllocations)
MemoryProfiler.EnableAllocations();
Console.WriteLine("Attached.");
然后我得到输出:
Press enter when connected.
MemoryProfiler.IsActive: True
MemoryProfiler.CanControlAllocations: False
然后调用EnableAllocations()
时抛出异常:
JetBrains.Profiler.Windows.Api.ProfilingApiException: 'Method isn't supported'
我希望这是因为MemoryProfiler.CanControlAllocations
是false
。
然而,如果我取消注释if
语句:
Console.WriteLine("Press enter when connected.");
Console.ReadLine();
Console.WriteLine($"MemoryProfiler.IsActive: {MemoryProfiler.IsActive}");
Console.WriteLine($"MemoryProfiler.CanControlAllocations: {MemoryProfiler.CanControlAllocations}");
if (MemoryProfiler.IsActive && MemoryProfiler.CanControlAllocations)
MemoryProfiler.EnableAllocations();
Console.WriteLine("Attached.");
然后一切都恢复正常,我得到了预期的输出:
Press enter when connected.
MemoryProfiler.IsActive: True
MemoryProfiler.CanControlAllocations: False
Attached.
答案 0 :(得分:1)
cat
始终MemoryProfiler.CanControlAllocations
处于附加模式,因为无法收集分配。请参阅false
COR_PRF_ALLOWABLE_AFTER_ATTACH
,COR_PRF_ENABLE_OBJECT_ALLOCATED
和COR_PRF_MONITOR_OBJECT_ALLOCATED
标记
P.S。 corprof.idl
和MemoryProfiler.EnableAllocations()
将始终在附加模式下抛出异常。
以下代码适用于启动和附加模式:
MemoryProfiler.DisableAllocations()
P.P.S。这是官方JetBrains的回答: - )