Присоединиться к себе с помощью ClrMD? HRESULT: 0x80070057

Я пытаюсь подключить ClrMD в процессе к себе:

private static void Main()
{
    var pid = Process.GetCurrentProcess().Id;

    WriteLine($"PID: {pid}");
    using (var dataTarget = DataTarget.AttachToProcess(pid, 1000))
    {
        WriteLine($"ClrMD attached");
    }
}

Однако я получаю следующее исключение:

PID: 7416

Unhandled Exception: Microsoft.Diagnostics.Runtime.ClrDiagnosticsException: Could not attach to pid 1CF8, HRESULT: 0x80070057
   at Microsoft.Diagnostics.Runtime.DbgEngDataReader..ctor(Int32 pid, AttachFlag flags, UInt32 msecTimeout)
   at Microsoft.Diagnostics.Runtime.DataTarget.AttachToProcess(Int32 pid, UInt32 msecTimeout, AttachFlag attachFlag)
   at Microsoft.Diagnostics.Runtime.DataTarget.AttachToProcess(Int32 pid, UInt32 msecTimeout)
   at BanksySan.Scratch.Console.Program.Main(String[] args)

Я могу прикрепить в пассивном режиме, но не в инвазивном или неинвазивном режиме.

1 ответ

Вы можете использовать DataTarget.CreateSnapshotAndAttach. Этот метод создает снимок процесса и создаетDataTargetот него. Пример:

var processId = Process.GetCurrentProcess().Id;

using (var dataTarget = DataTarget.CreateSnapshotAndAttach(processId))
{
}

Invasive flag позволяет потребителю этого API управлять целевым процессом посредством обычных вызовов функции IDebug. Этот процесс будет приостановлен (на время присоединения), чтобы получить данные и контролировать целевой процесс.

В NonInvasive присоединение отладчика, процесс будет приостановлен этим (на время присоединения) и сможет получить данные, но вызывающая сторона не сможет контролировать целевой процесс. Это полезно, когда к процессу уже подключен отладчик.

Выполнение Passive attach означает, что никакой отладчик фактически не присоединен к целевому процессу. Процесс не приостанавливается, поэтому запросы на быстро изменяющиеся данные (например, содержимое кучи GC или стеки вызовов) будут крайне противоречивыми, если пользователь не приостановит процесс другими способами. Это полезно при подключении с помощью ICorDebug (управляемого отладчика), так как вы не можете использовать неинвазивное подключение с ICorDebug.

Другие вопросы по тегам