5

我正在尝试将 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)

可以在被动模式下连接,但不能在侵入式或非侵入式模式下连接。

4

2 回答 2

5

您可以使用DataTarget.CreateSnapshotAndAttach. 此方法创建进程的快照并DataTarget从中创建。例子:

var processId = Process.GetCurrentProcess().Id;

using (var dataTarget = DataTarget.CreateSnapshotAndAttach(processId))
{
}
于 2019-09-04T14:37:46.377 回答
1

Invasiveflag 允许此 API 的使用者通过正常的 IDebug 函数调用来控制目标进程。该进程将由此暂停(在附加期间),以获取数据并控制目标进程

NonInvasive调试器附加中,进程将由此暂停(在附加期间),并且能够获取数据,但调用者无法控制目标进程。当已经有一个调试器附加到进程时,这很有用。

执行Passive附加意味着没有调试器实际上附加到目标进程。进程没有暂停,所以对于快速变化的数据(比如 GC 堆或调用栈的内容)的查询将高度不一致,除非用户通过其他方式暂停进程。它在使用 ICorDebug(托管调试器)附加时很有用,因为您不能对 ICorDebug 使用非侵入式附加。

于 2018-02-27T13:40:18.153 回答