public void SetUp() { var taskContext = new JoinableTaskContext(); remoteThread = Substitute.For <RemoteThread>(); mockThread = Substitute.For <IDebugThread>(); mockThread.GetRemoteThread().Returns(remoteThread); mockDebugEngineHandler = Substitute.For <IDebugEngineHandler>(); mockDebugThreadCreator = Substitute.For <DebugProgram.ThreadCreator>(); mockDebugDisassemblyStreamFactory = Substitute.For <DebugDisassemblyStream.Factory>(); mockProcess = Substitute.For <IDebugProcess2>(); var guid = new Guid(); mockSbProcess = Substitute.For <SbProcess>(); mockRemoteTarget = Substitute.For <RemoteTarget>(); mockDocumentContextFactory = Substitute.For <DebugDocumentContext.Factory>(); mockCodeContextFactory = Substitute.For <DebugCodeContext.Factory>(); threadEnumFactory = new ThreadEnumFactory(); moduleEnumFactory = new ModuleEnumFactory(); codeContextEnumFactory = new CodeContextEnumFactory(); mockDebugModuleCache = Substitute.For <IDebugModuleCache>(); program = new DebugProgram.Factory(taskContext, mockDebugDisassemblyStreamFactory, mockDocumentContextFactory, mockCodeContextFactory, threadEnumFactory, moduleEnumFactory, codeContextEnumFactory) .Create(mockDebugEngineHandler, mockDebugThreadCreator, mockProcess, guid, mockSbProcess, mockRemoteTarget, mockDebugModuleCache, false); }
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)); }