public void IfErrorWhenError() { var expected = new Exception(); var ei = ExitInfo.Error(expected); Exception actual = null; ei.IfError(e => actual = e); Assert.AreEqual(expected, actual); }
public void HandleResultWhenError() { var expected = new Exception(); var ei = ExitInfo.Error(expected); Exception actual = null; var normalCalled = false; ei.HandleResult( onNormal: _ => normalCalled = true, onError: e => actual = e); Assert.AreEqual(expected, actual); Assert.IsFalse(normalCalled); }
public int Terminate() { TerminationRequested = true; //TODO: remove the legacy launch flow. if (!_lldbProcess.Kill()) { // Visual Studio waits for the ProgramDestroyEvent regardless of whether // Terminate() succeeds, so we send the event on failure as well as on success. _debugEngineHandler.Abort( this, ExitInfo.Error(new TerminateProcessException(ErrorStrings.FailedToStopGame))); return(VSConstants.E_FAIL); } // Send the ProgramDestroyEvent immediately, so that Visual Studio can't cause a // deadlock by waiting for the event while preventing us from accessing the main thread. // TODO: Block and wait for LldbEventHandler to send the event _debugEngineHandler.Abort(this, ExitInfo.Normal(ExitReason.DebuggerTerminated)); return(VSConstants.S_OK); }
public ILldbAttachedProgram Create( IDebugProcess2 debugProcess, Guid programId, IDebugEngine2 debugEngine, IDebugEventCallback2 callback, SbDebugger debugger, RemoteTarget target, LldbListenerSubscriber listenerSubscriber, SbProcess process, SbCommandInterpreter commandInterpreter, bool isCoreAttach, IExceptionManager exceptionManager, IModuleSearchLogHolder moduleSearchLogHolder, uint remotePid) { // Required due to an issue triggered by the proxy used to wrap debugProgramFactory. // TODO: Remove assertion once the issue with Castle.DynamicProxy is // fixed. _taskContext.ThrowIfNotOnMainThread(); var debugEngineHandler = _debugEngineHandlerFactory.Create(debugEngine, callback); var binaryLoader = _binaryLoaderFactory.Create(target); var symbolLoader = _symbolLoaderFactory.Create(commandInterpreter); var moduleFileLoader = _moduleFileLoaderFactory.Create(symbolLoader, binaryLoader, moduleSearchLogHolder); var debugModuleCache = _debugModuleCacheFactory.Create( (lldbModule, loadOrder, ggpProgram) => _debugModuleFactory.Create( moduleFileLoader, moduleSearchLogHolder, lldbModule, loadOrder, debugEngineHandler, ggpProgram)); var ad7FrameInfoCreator = new AD7FrameInfoCreator(debugModuleCache); var stackFrameCreator = new StackFramesProvider.StackFrameCreator( (frame, thread, program) => _debugStackFrameCreator( ad7FrameInfoCreator, frame, thread, debugEngineHandler, program)); var threadCreator = new DebugProgram.ThreadCreator( (thread, program) => _debugThreadCreatorDelegate( ad7FrameInfoCreator, stackFrameCreator, thread, program)); var debugProgram = _debugProgramFactory.Create( debugEngineHandler, threadCreator, debugProcess, programId, process, target, debugModuleCache, isCoreAttach); _taskExecutor.StartAsyncTasks( ex => debugEngineHandler.Abort(debugProgram, ExitInfo.Error(ex))); var breakpointManager = _breakpointManagerFactory.Create(debugEngineHandler, debugProgram); var eventManager = _eventManagerFactory.Create(debugEngineHandler, breakpointManager, debugProgram, process, listenerSubscriber); // TODO: Listen for module load/unload events from LLDB binaryLoader.LldbModuleReplaced += (o, args) => { debugModuleCache.GetOrCreate(args.AddedModule, debugProgram); debugModuleCache.Remove(args.RemovedModule); }; debugModuleCache.ModuleAdded += (o, args) => debugEngineHandler.OnModuleLoad(args.Module, debugProgram); debugModuleCache.ModuleRemoved += (o, args) => debugEngineHandler.OnModuleUnload(args.Module, debugProgram); return(new LldbAttachedProgram(breakpointManager, eventManager, _lldbShell, moduleFileLoader, debugEngineHandler, _taskExecutor, debugProgram, debugger, target, process, exceptionManager, debugModuleCache, listenerSubscriber, remotePid)); }
void LldbListenerOnExceptionOccured(object sender, ExceptionOccuredEventArgs e) { Trace.WriteLine("Exception in listener: " + e); _debugEngineHandler.Abort(_program, ExitInfo.Error(e.Exception)); }