Ich habe ein Problem, das ziemlich einzigartig sein kann. Ich habe eine Anwendung, die stundenlang auf einer kopflosen Box läuft, wenn ich nicht anwesend bin, aber nicht kritisch ist. Ich möchte in der Lage sein, diese Anwendung remote mit Visual Studio zu debuggen. Um dies zu tun, ich habe Code, der wie folgt aussieht:C# suspendiert alle Threads
// 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();
Die Idee ist, dass auf diese Weise, ich einen Fehler getroffen, während ich weg bin, und die Anwendung Pausen selbst effektiv und wartet auf einen Remote-Debugger anhängen , die nach dem ersten fortfahren automatisch den richtigen Kontext dank der Debugger.Break
Aufruf erhält.
Hier ist das Problem: Implementierung SuspendAllButCurrentThread
erweist sich als nicht trivial. Thread.Suspend
ist veraltet, und ich kann P/Invoke nicht bis SuspendThread
aufrufen, da es keine Eins-zu-Eins-Zuordnung zwischen verwalteten Threads und nativen Threads gibt (da ich den aktuellen Thread am Leben halten muss). Ich möchte Visual Studio nicht auf dem fraglichen Computer installieren, wenn es möglicherweise vermieden werden kann. Wie kann ich das schaffen?
Dumm Frage wahrscheinlich, aber VS nicht Remote Debugging ohne dass Sie durch diese Reifen springen müssen? Ich nahm immer an, dass Sie aus der Ferne ohne Code-Änderungen debuggen können, aber ich muss zugeben, ich habe nur lokal debuggt, – Surfbutler