我有一个可能相当独特的问题。我有一个应用程序可以在我不在的时候在无头盒子上运行很长时间,但并不重要。我希望能够使用 Visual Studio 远程调试此应用程序。为此,我有如下代码:
// Suspend all other threads to prevent loss
// of state while we investigate the issue.
SuspendAllButCurrentThread();
var remoteDebuggerProcess = new Process
{
StartInfo =
{
UseShellExecute = true,
FileName = MsVsMonPath;
}
};
// Exception handling and early return removed here for brevity.
remoteDebuggerProcess.Start();
// Wait for a debugger attach.
while (!Debugger.IsAttached)
{
Thread.Sleep(500);
}
Debugger.Break();
// Once we get here, we've hit continue in the debugger. Restore all of our threads,
// then get rid of the remote debugging tools.
ResumeAllButCurrentThread();
remoteDebuggerProcess.CloseMainWindow();
remoteDebuggerProcess.WaitForExit();
这样的想法是,当我离开时,我遇到了一个错误,应用程序有效地暂停并等待远程调试器附加,在第一次 continue 之后,由于Debugger.Break
调用,它会自动获取正确的上下文。
问题是:实施SuspendAllButCurrentThread
结果证明是不平凡的。Thread.Suspend
已弃用,并且我无法 P/Invoke 到,SuspendThread
因为托管线程和本机线程之间没有一对一的映射(因为我需要保持当前线程处于活动状态)。如果可以避免的话,我不想在有问题的机器上安装 Visual Studio。我怎样才能使这项工作?