Exemplo n.º 1
0
        /// <summary>
        /// The hybrid mode uses both WinDbg and System Debugger
        /// </summary>
        /// <remarks>
        /// When _hybrid == true &amp;&amp; _replay == false we will use the
        /// System Debugger.
        ///
        /// When we hit a fault in _hybrid mode we will replay with windbg.
        ///
        /// When _hybrid == false we will just use windbg.
        /// </remarks>
        protected void _StartDebuggerHybrid()
        {
            if (_replay)
            {
                _StartDebuggerHybridReplay();
                return;
            }

            // Start system debugger
            if (_systemDebugger == null || !_systemDebugger.IsRunning)
            {
                if (_systemDebugger == null)
                {
                    _systemDebugger = new SystemDebuggerInstance();

                    _systemDebugger.commandLine = _commandLine;
                    _systemDebugger.processName = _processName;
                    _systemDebugger.service     = _service;
                    _systemDebugger.ignoreFirstChanceGuardPage  = _ignoreFirstChanceGuardPage;
                    _systemDebugger.ignoreSecondChanceGuardPage = _ignoreSecondChanceGuardPage;
                    _systemDebugger.noCpuKill = _noCpuKill;
                }

                _systemDebugger.StopDebugger();
                _systemDebugger.StartDebugger();
            }
        }
Exemplo n.º 2
0
        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;
            }
        }
Exemplo n.º 3
0
        public override void StopMonitor()
        {
            _StopDebugger();
            _FinishDebugger();

            if (_ipcChannel != null)
            {
                ChannelServices.UnregisterChannel(_ipcChannel);
            }

            _ipcChannel     = null;
            _debugger       = null;
            _systemDebugger = null;
        }
Exemplo n.º 4
0
        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;
            }
        }
Exemplo n.º 5
0
        public void BadProcess()
        {
            var dbg = new SystemDebuggerInstance()
            {
                commandLine = "foo.exe"
            };

            try
            {
                dbg.StartDebugger();
                Assert.Fail("Should throw");
            }
            catch (PeachException ex)
            {
                Assert.True(ex.Message.StartsWith("System debugger could not start process 'foo.exe'."));
            }
        }
Exemplo n.º 6
0
        public void ServiceTest()
        {
            if (!Peach.Core.OS.Windows.Privilege.IsUserAdministrator())
            {
                Assert.Ignore("User is not an administrator.");
            }

            try
            {
                using (var si = SingleInstance.CreateInstance("Peach.Core.Test.OS.Windows.WinSystemTests"))
                {
                    si.Lock();

                    var dbg = new SystemDebuggerInstance()
                    {
                        service = "iphlpsvc"
                    };
                    dbg.StartDebugger();

                    for (int i = 0; i < 10; ++i)
                    {
                        Assert.True(dbg.IsRunning);
                        System.Threading.Thread.Sleep(100);
                    }

                    dbg.StopDebugger();

                    Assert.Null(dbg.crashInfo);
                }
            }
            finally
            {
                using (ServiceController srv = new ServiceController("iphlpsvc"))
                {
                    if (srv.Status == ServiceControllerStatus.Stopped)
                    {
                        srv.Start();
                    }
                }
            }
        }
Exemplo n.º 7
0
        public override bool DetectedFault()
        {
            logger.Info("DetectedFault()");

            _fault = null;

            if (_systemDebugger != null && _systemDebugger.caughtException)
            {
                logger.Info("DetectedFault - Using system debugger, caught exception");
                _fault = _systemDebugger.crashInfo;

                _systemDebugger.StopDebugger();
                _systemDebugger = null;
            }
            else if (_debugger != null && _hybrid)
            {
                logger.Info("DetectedFault - Using WinDbg, checking for fault");

                // Lets give windbg a chance to detect the crash.
                // 10 seconds should be enough.
                for (int i = 0; i < 10; i++)
                {
                    if (_debugger != null && _debugger.caughtException)
                    {
                        // Kill off our debugger process and re-create
                        _debuggerProcessUsage = _debuggerProcessUsageMax;
                        _fault = _debugger.crashInfo;
                        break;
                    }

                    Thread.Sleep(1000);
                }

                if (_fault == null && _earlyExitFault)
                {
                    _fault = GetEarlyExitFault();
                }

                if (_fault != null)
                {
                    logger.Info("DetectedFault - Caught fault with windbg");
                }

                if (_debugger != null && _hybrid && _fault == null)
                {
                    _StopDebugger();
                    _FinishDebugger();
                }
            }
            else if (_debugger != null && _debugger.caughtException)
            {
                // Kill off our debugger process and re-create
                _debuggerProcessUsage = _debuggerProcessUsageMax;
                _fault = _debugger.crashInfo;
            }
            else if (_earlyExitFault)
            {
                logger.Info("DetectedFault() - Fault detected, process exited early");
                _fault = GetEarlyExitFault();
            }
            else if (_waitForExitFailed)
            {
                logger.Info("DetectedFault() - Fault detected, WaitForExitOnCall failed");
                _fault = GetGeneralFault("ProcessFailedToExit", "Process did not exit in " + _waitForExitTimeout + "ms");
            }

            if (_fault == null)
            {
                logger.Info("DetectedFault() - No fault detected");
            }

            return(_fault != null);
        }