.NET Profiler ввод/вывод функций не вызывается

Я хочу использовать профилировщик .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-профилировщика не вызываются (я пытался вывести сообщение в обратном вызове).

Что мне не хватает? Есть ли что-то еще, кроме регистрации перехватчиков функций входа/выхода? Или я делаю неправильные предположения о функциях входа/выхода?


person Johannes Egger    schedule 18.02.2014    source источник


Ответы (1)


Я просто прочитайте, что есть дополнительные флаги, которые вы можете установить, чтобы указать, какие события вас интересуют. Одним из них является COR_PRF_MONITOR_ENTERLEAVE, который делает именно то, что я искал. Спасибо rubberduck.

person Johannes Egger    schedule 18.02.2014