Я хочу использовать профилировщик .NET для отслеживания вызываемых функций приложения. Я использовал профилировщик CLR в качестве шаблона, но не менял сам профилировщик (проект ProfilerOBJ
) (кроме GUID ). Когда я пытаюсь профилировать приложение, обработчики функций ввода/вывода (кроме других обратных вызовов, таких как JITCompilationStarted
) не вызываются. Но есть также некоторые обратные вызовы, которые вызываются (например, Shutdown
) (что говорит мне, что профайлер загружается в процессе).
Я безуспешно пытался запустить процессы в 32- и 64-разрядных версиях (с 64-разрядными перехватчиками функций, похоже, где-то определены).
Тестовое приложение, которое я профилировал, выглядит следующим образом:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Press Enter to allocate object");
Console.ReadLine();
var obj = new Person();
Console.WriteLine("Press Enter to call method on allocated object");
Console.ReadLine();
obj.Walk();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
}
}
class Person
{
private int walked = 0;
public void Walk()
{
this.walked++;
}
}
Я ожидал, что по крайней мере будут вызываться обратные вызовы ICorProfilerCallback::ObjectAllocated
и перехватчики функций входа/выхода. Но единственным вызванным обратным вызовом был ICorProfilerCallback::Shutdown
.
Кажется, что даже хуки функций входа/выхода исходного CLR-профилировщика не вызываются (я пытался вывести сообщение в обратном вызове).
Что мне не хватает? Есть ли что-то еще, кроме регистрации перехватчиков функций входа/выхода? Или я делаю неправильные предположения о функциях входа/выхода?