public override Task <LoadCoreResponse> LoadCore(LoadCoreRequest request, ServerCallContext context) { RemoteTarget target = GrpcLookupUtils.GetTarget(request.Target, _targetStore); SbProcess process = target.LoadCore(request.CorePath); var response = new LoadCoreResponse(); if (process != null) { if (!_processStore.TryAdd(process.GetUniqueId(), process)) { ErrorUtils.ThrowError(StatusCode.Internal, "Could not add process to store: " + process.GetUniqueId()); } response.Process = new GrpcSbProcess { Id = process.GetUniqueId() }; } return(Task.FromResult(response)); }
SbProcess LoadCore(RemoteTarget lldbTarget, IAction loadCoreAction) { var moduleFileLoadRecorder = _moduleFileLoadRecorderFactory.Create(loadCoreAction); moduleFileLoadRecorder.RecordBeforeLoad(Array.Empty <SbModule>()); bool isFullDump = _coreFilePath.EndsWith(".core"); if (isFullDump) { string combinedPath = _taskContext.Factory.Run(async() => { await _taskContext.Factory.SwitchToMainThreadAsync(); _symbolSettingsProvider.GetStorePaths(out string paths, out string cache); return(SymbolUtils.GetCombinedLookupPaths(paths, cache)); }); _moduleFileFinder.SetSearchPaths(combinedPath); TextWriter searchLog = new StringWriter(); DumpReadResult dump = _dumpModulesProvider.GetModules(_coreFilePath); DumpModule[] executableModules = dump.Modules.Where(module => module.IsExecutable).ToArray(); DumpModule[] nonExecutableModules = dump.Modules.Where(module => !module.IsExecutable).ToArray(); // We should not pre-load non executable modules if there wasn't any successfully // loaded executable modules. Otherwise lldb will not upgrade image list during the // attachment to the core dump and will try to resolve the executable on the // developer machine. See (internal) if (executableModules.Any() && executableModules.All(module => TryPreloadModule(lldbTarget, searchLog, module))) { foreach (DumpModule module in nonExecutableModules) { TryPreloadModule(lldbTarget, searchLog, module); } } if (dump.Warning == DumpReadWarning.None && !executableModules.Any()) { dump.Warning = DumpReadWarning.ExecutableBuildIdMissing; } if (dump.Warning != DumpReadWarning.None) { var shouldAttach = _taskContext.Factory.Run( async() => await _warningDialog.ShouldAttachToIncosistentCoreFileAsync( dump.Warning)); if (!shouldAttach) { throw new CoreAttachStoppedException(); } } } SbProcess lldbDebuggerProcess = lldbTarget.LoadCore(_coreFilePath); if (lldbDebuggerProcess == null) { throw new AttachException(VSConstants.E_ABORT, ErrorStrings.FailedToLoadCore(_coreFilePath)); } RecordModules(lldbTarget, moduleFileLoadRecorder); return(lldbDebuggerProcess); }