/// <summary> /// Hybrid replay mode uses windbg /// </summary> protected void _StartDebuggerHybridReplay() { if (_debuggerProcess == null || _debuggerProcess.HasExited) { using (var p = System.Diagnostics.Process.GetCurrentProcess()) { _debuggerChannelName = "PeachCore_" + p.Id + "_" + (ipcChannelCount++); } // Launch the server process _debuggerProcess = new System.Diagnostics.Process(); _debuggerProcess.StartInfo.CreateNoWindow = true; _debuggerProcess.StartInfo.UseShellExecute = false; _debuggerProcess.StartInfo.Arguments = _debuggerChannelName; _debuggerProcess.StartInfo.FileName = Path.Combine( Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Peach.Core.WindowsDebugInstance.exe"); _debuggerProcess.Start(); // Let the process get started. Thread.Sleep(2000); } // Try and create instance over IPC. We will continue trying for 1 minute. DateTime startTimer = DateTime.Now; while (true) { try { _debugger = (DebuggerInstance)Activator.GetObject(typeof(DebuggerInstance), "ipc://" + _debuggerChannelName + "/DebuggerInstance"); _debugger.commandLine = _commandLine; _debugger.processName = _processName; _debugger.kernelConnectionString = _kernelConnectionString; _debugger.service = _service; _debugger.symbolsPath = _symbolsPath; _debugger.startOnCall = _startOnCall; _debugger.ignoreFirstChanceGuardPage = _ignoreFirstChanceGuardPage; _debugger.ignoreSecondChanceGuardPage = _ignoreSecondChanceGuardPage; _debugger.noCpuKill = _noCpuKill; _debugger.winDbgPath = _winDbgPath; break; } catch { if ((DateTime.Now - startTimer).Minutes >= 1) { _debuggerProcess.Kill(); _debuggerProcess = null; throw; } } } _debugger.StartDebugger(); }
protected void _FinishDebugger() { logger.Debug("_FinishDebugger"); _StopDebugger(); if (_systemDebugger != null) { try { _systemDebugger.FinishDebugging(); } catch { } } if (_debugger != null) { try { _debugger.FinishDebugging(); } catch { } _ipcHeartBeatMutex.ReleaseMutex(); _ipcHeartBeatThread.Join(); _ipcHeartBeatThread = null; _ipcHeartBeatMutex = null; } _debugger = null; _systemDebugger = null; if (_debuggerProcess != null) { try { if (!_debuggerProcess.WaitForExit(2000)) { _debuggerProcess.Kill(); } } catch { } _debuggerProcess.Close(); _debuggerProcess = null; } }
public override void StopMonitor() { _StopDebugger(); _FinishDebugger(); if (_ipcChannel != null) { ChannelServices.UnregisterChannel(_ipcChannel); } _ipcChannel = null; _debugger = null; _systemDebugger = null; }
protected void _FinishDebugger() { _StopDebugger(); if (_systemDebugger != null) { try { _systemDebugger.FinishDebugging(); } catch { } } if (_debugger != null) { try { _debugger.FinishDebugging(); } catch { } } _debugger = null; _systemDebugger = null; if (_debuggerProcess != null) { try { if (!_debuggerProcess.WaitForExit(2000)) { _debuggerProcess.Kill(); } } catch { } _debuggerProcess.Close(); _debuggerProcess = null; } }
/// <summary> /// Origional non-hybrid windbg only mode /// </summary> protected void _StartDebuggerNonHybrid() { logger.Debug("_StartDebuggerNonHybrid"); if (_debuggerProcessUsage >= _debuggerProcessUsageMax && _debuggerProcess != null) { _FinishDebugger(); _debuggerProcessUsage = 0; } if (_debuggerProcess == null || _debuggerProcess.HasExited) { _debuggerChannelName = "PeachCore_" + (new Random((uint)Environment.TickCount).NextUInt32().ToString()); // Launch the server process _debuggerProcess = new System.Diagnostics.Process(); _debuggerProcess.StartInfo.CreateNoWindow = true; _debuggerProcess.StartInfo.UseShellExecute = false; _debuggerProcess.StartInfo.Arguments = _debuggerChannelName; _debuggerProcess.StartInfo.FileName = Path.Combine( Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Peach.Core.WindowsDebugInstance.exe"); if (logger.IsTraceEnabled) { _debuggerProcess.EnableRaisingEvents = true; _debuggerProcess.StartInfo.Arguments += " --debug"; _debuggerProcess.OutputDataReceived += _debuggerProcess_OutputDataReceived; _debuggerProcess.ErrorDataReceived += _debuggerProcess_ErrorDataReceived; _debuggerProcess.StartInfo.RedirectStandardError = true; _debuggerProcess.StartInfo.RedirectStandardOutput = true; } _debuggerProcess.Start(); if (logger.IsTraceEnabled) { _debuggerProcess.BeginErrorReadLine(); _debuggerProcess.BeginOutputReadLine(); } } _debuggerProcessUsage++; // Try and create instance over IPC. We will continue trying for 1 minute. DateTime startTimer = DateTime.Now; while (true) { try { logger.Debug("Creating DebuggerInstance: ipc://" + _debuggerChannelName + "/DebuggerInstance"); _debugger = (DebuggerInstance)Activator.GetObject(typeof(DebuggerInstance), "ipc://" + _debuggerChannelName + "/DebuggerInstance"); //_debugger = new DebuggerInstance(); _debugger.commandLine = _commandLine; _debugger.processName = _processName; _debugger.kernelConnectionString = _kernelConnectionString; _debugger.service = _service; _debugger.symbolsPath = _symbolsPath; _debugger.startOnCall = _startOnCall; _debugger.ignoreFirstChanceGuardPage = _ignoreFirstChanceGuardPage; _debugger.ignoreSecondChanceGuardPage = _ignoreSecondChanceGuardPage; _debugger.noCpuKill = _noCpuKill; _debugger.winDbgPath = _winDbgPath; // Start a thread to send heartbeats to ipc process // otherwise ipc process will exit _ipcHeartBeatMutex = new Mutex(); _ipcHeartBeatMutex.WaitOne(); _ipcHeartBeatThread = new Thread(new ThreadStart(IpcHeartBeat)); _ipcHeartBeatThread.Start(); break; } catch (Exception ex) { logger.Debug("IPC Exception: " + ex.Message); logger.Debug("Retrying IPC connection"); if ((DateTime.Now - startTimer).Minutes >= 1) { try { logger.Debug("IPC Failed"); _debuggerProcess.Kill(); _debuggerProcess.Close(); } catch { } throw; } } } _debugger.StartDebugger(); }
/// <summary> /// Hybrid replay mode uses windbg /// </summary> protected void _StartDebuggerHybridReplay() { if (_debuggerProcess == null || _debuggerProcess.HasExited) { using (var p = System.Diagnostics.Process.GetCurrentProcess()) { _debuggerChannelName = "PeachCore_" + p.Id + "_" + (ipcChannelCount++); } // Launch the server process _debuggerProcess = new System.Diagnostics.Process(); _debuggerProcess.StartInfo.CreateNoWindow = true; _debuggerProcess.StartInfo.UseShellExecute = false; _debuggerProcess.StartInfo.Arguments = _debuggerChannelName; _debuggerProcess.StartInfo.FileName = Path.Combine( Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Peach.Core.WindowsDebugInstance.exe"); if (logger.IsTraceEnabled) { _debuggerProcess.EnableRaisingEvents = true; _debuggerProcess.StartInfo.Arguments += " --debug"; _debuggerProcess.OutputDataReceived += _debuggerProcess_OutputDataReceived; _debuggerProcess.ErrorDataReceived += _debuggerProcess_ErrorDataReceived; _debuggerProcess.StartInfo.RedirectStandardError = true; _debuggerProcess.StartInfo.RedirectStandardOutput = true; } _debuggerProcess.Start(); if (logger.IsTraceEnabled) { _debuggerProcess.BeginErrorReadLine(); _debuggerProcess.BeginOutputReadLine(); } // Let the process get started. Thread.Sleep(2000); } // Try and create instance over IPC. We will continue trying for 1 minute. DateTime startTimer = DateTime.Now; while (true) { try { logger.Debug("Trying to create DebuggerInstance: ipc://" + _debuggerChannelName + "/DebuggerInstance"); _debugger = (DebuggerInstance)Activator.GetObject(typeof(DebuggerInstance), "ipc://" + _debuggerChannelName + "/DebuggerInstance"); _debugger.commandLine = _commandLine; _debugger.processName = _processName; _debugger.kernelConnectionString = _kernelConnectionString; _debugger.service = _service; _debugger.symbolsPath = _symbolsPath; _debugger.startOnCall = _startOnCall; _debugger.ignoreFirstChanceGuardPage = _ignoreFirstChanceGuardPage; _debugger.ignoreSecondChanceGuardPage = _ignoreSecondChanceGuardPage; _debugger.noCpuKill = _noCpuKill; _debugger.winDbgPath = _winDbgPath; // Start a thread to send heartbeats to ipc process // otherwise ipc process will exit _ipcHeartBeatMutex = new Mutex(); _ipcHeartBeatMutex.WaitOne(); _ipcHeartBeatThread = new Thread(new ThreadStart(IpcHeartBeat)); _ipcHeartBeatThread.Start(); logger.Debug("Created!"); break; } catch (Exception ex) { logger.Debug("IPC Failed: " + ex.Message); if ((DateTime.Now - startTimer).Minutes >= 1) { _debuggerProcess.Kill(); _debuggerProcess = null; throw; } } } _debugger.StartDebugger(); }
/// <summary> /// Origional non-hybrid windbg only mode /// </summary> protected void _StartDebuggerNonHybrid() { if (_debuggerProcessUsage >= _debuggerProcessUsageMax && _debuggerProcess != null) { _FinishDebugger(); _debuggerProcessUsage = 0; } if (_debuggerProcess == null || _debuggerProcess.HasExited) { _debuggerChannelName = "PeachCore_" + (new Random((uint)Environment.TickCount).NextUInt32().ToString()); // Launch the server process _debuggerProcess = new System.Diagnostics.Process(); _debuggerProcess.StartInfo.CreateNoWindow = true; _debuggerProcess.StartInfo.UseShellExecute = false; _debuggerProcess.StartInfo.Arguments = _debuggerChannelName; _debuggerProcess.StartInfo.FileName = Path.Combine( Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Peach.Core.WindowsDebugInstance.exe"); _debuggerProcess.Start(); } _debuggerProcessUsage++; // Try and create instance over IPC. We will continue trying for 1 minute. DateTime startTimer = DateTime.Now; while (true) { try { _debugger = (DebuggerInstance)Activator.GetObject(typeof(DebuggerInstance), "ipc://" + _debuggerChannelName + "/DebuggerInstance"); //_debugger = new DebuggerInstance(); _debugger.commandLine = _commandLine; _debugger.processName = _processName; _debugger.kernelConnectionString = _kernelConnectionString; _debugger.service = _service; _debugger.symbolsPath = _symbolsPath; _debugger.startOnCall = _startOnCall; _debugger.ignoreFirstChanceGuardPage = _ignoreFirstChanceGuardPage; _debugger.ignoreSecondChanceGuardPage = _ignoreSecondChanceGuardPage; _debugger.noCpuKill = _noCpuKill; _debugger.winDbgPath = _winDbgPath; break; } catch { if ((DateTime.Now - startTimer).Minutes >= 1) { _debuggerProcess.Kill(); _debuggerProcess.Close(); throw; } } } _debugger.StartDebugger(); }