0

我正在使用Microsoft.Diagnostics.Runtimenuget 包,这是我尝试获取堆栈跟踪时的代码:

var pid = Process.GetCurrentProcess().Id;
// Line of error
using (var dataTarget = DataTarget.AttachToProcess(pid, 5000, AttachFlag.Invasive))
{
    ClrInfo currentRuntime = dataTarget.ClrVersions[0];
    var runtime = currentRuntime.CreateRuntime();
    foreach (var t in runtime.Threads)
    {
        MessageBox.Show("Got here");
        t.StackTrace
    }
}

问题类似于Attach to self with ClrMD? HRESULT:0x80070057但我更进一步,使用 Wix 构建应用程序。然后,我将应用程序安装在我的桌面上,这样它就可以在没有 Visual Studio 及其调试器的情况下运行。

只要我把它放在 line 之后,消息框就不会显示using (var dataTarget = DataTarget.AttachToProcess(pid, 5000, AttachFlag.Invasive))。如果我之前放置了消息框,则消息框会显示。

在代码中,我得到了错误

Microsoft.Diagnostics.Runtime.ClrDiagnosticsException: 'Could not attach to pid 624, HRESULT: 0x80070057'

我想我明白为什么AttachFlag.Invasive我在 Visual Studio 中运行应用程序时因为它正在被调试而不起作用,但我不明白为什么在我使用 Wix 构建它并将其安装在我的桌面上之后该行不起作用。

同样,与附加的 Stackoverflow 帖子一样AttachFlag.InvasiveAttachFlag.NonInvasive它不起作用,但AttachFlag.Passive确实有效。

4

1 回答 1

0

就像我的回答一样:https ://stackoverflow.com/a/57790758/7122901

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

var processId = Process.GetCurrentProcess().Id;

using (var dataTarget = DataTarget.CreateSnapshotAndAttach(processId))
{
}
于 2019-09-05T10:30:01.180 回答