use of org.dartlang.vm.service.element.Sentinel in project flutter-intellij by flutter.
the class CanonicalBreakpoint method computeStackFrames.
public void computeStackFrames(@NotNull final String isolateId, final int firstFrameIndex, @NotNull final XExecutionStack.XStackFrameContainer container, @Nullable final InstanceRef exception) {
addRequest(() -> myVmService.getStack(isolateId, new GetStackConsumer() {
@Override
public void received(final Stack vmStack) {
ApplicationManager.getApplication().executeOnPooledThread(() -> {
InstanceRef exceptionToAddToFrame = exception;
// Check for async causal frames; fall back to using regular sync frames.
ElementList<Frame> elementList = vmStack.getAsyncCausalFrames();
if (elementList == null) {
elementList = vmStack.getFrames();
}
final List<Frame> vmFrames = Lists.newArrayList(elementList);
final List<XStackFrame> xStackFrames = new ArrayList<>(vmFrames.size());
for (final Frame vmFrame : vmFrames) {
if (vmFrame.getKind() == FrameKind.AsyncSuspensionMarker) {
// Render an asynchronous gap.
final XStackFrame markerFrame = new DartAsyncMarkerFrame();
xStackFrames.add(markerFrame);
} else {
final DartVmServiceStackFrame stackFrame = new DartVmServiceStackFrame(myDebugProcess, isolateId, vmFrame, vmFrames, exceptionToAddToFrame);
stackFrame.setIsDroppableFrame(vmFrame.getKind() == FrameKind.Regular);
xStackFrames.add(stackFrame);
if (!stackFrame.isInDartSdkPatchFile()) {
// The exception (if any) is added to the frame where debugger stops and to the upper frames.
exceptionToAddToFrame = null;
}
}
}
container.addStackFrames(firstFrameIndex == 0 ? xStackFrames : xStackFrames.subList(firstFrameIndex, xStackFrames.size()), true);
});
}
@Override
public void onError(final RPCError error) {
container.errorOccurred(error.getMessage());
}
@Override
public void received(Sentinel response) {
container.errorOccurred(response.getValueAsString());
}
}));
}
use of org.dartlang.vm.service.element.Sentinel in project flutter-intellij by flutter.
the class CanonicalBreakpoint method attachIsolate.
public void attachIsolate(@NotNull IsolateRef isolateRef, @NotNull Isolate isolate) {
final boolean newIsolate = myIsolatesInfo.addIsolate(isolateRef);
// Just to make sure that the main isolate is not handled twice, both from handleDebuggerConnected() and DartVmServiceListener.received(PauseStart)
if (newIsolate) {
final XDebugSessionImpl session = (XDebugSessionImpl) myDebugProcess.getSession();
ApplicationManager.getApplication().runReadAction(() -> {
session.reset();
session.initBreakpoints();
});
addRequest(() -> myVmService.setExceptionPauseMode(isolateRef.getId(), myDebugProcess.getBreakOnExceptionMode(), new SetExceptionPauseModeConsumer() {
@Override
public void received(Success response) {
setInitialBreakpointsAndCheckExtensions(isolateRef, isolate);
}
@Override
public void onError(RPCError error) {
}
@Override
public void received(Sentinel response) {
}
}));
}
}
use of org.dartlang.vm.service.element.Sentinel in project flutter-intellij by flutter.
the class CanonicalBreakpoint method getCachedIsolate.
public CompletableFuture<Isolate> getCachedIsolate(@NotNull final String isolateId) {
return myIsolatesInfo.getCachedIsolate(isolateId, () -> {
final CompletableFuture<Isolate> isolateFuture = new CompletableFuture<>();
getIsolate(isolateId, new GetIsolateConsumer() {
@Override
public void onError(RPCError error) {
isolateFuture.completeExceptionally(new RuntimeException(error.getMessage()));
}
@Override
public void received(Isolate response) {
isolateFuture.complete(response);
}
@Override
public void received(Sentinel response) {
// Unable to get the isolate.
isolateFuture.complete(null);
}
});
return isolateFuture;
});
}
use of org.dartlang.vm.service.element.Sentinel in project flutter-intellij by flutter.
the class CanonicalBreakpoint method doSetBreakpointsForIsolate.
private void doSetBreakpointsForIsolate(@NotNull final Set<XLineBreakpoint<XBreakpointProperties>> xBreakpoints, @NotNull final String isolateId, @Nullable final Runnable onFinished) {
if (xBreakpoints.isEmpty()) {
if (onFinished != null) {
onFinished.run();
}
return;
}
final AtomicInteger counter = new AtomicInteger(xBreakpoints.size());
for (final XLineBreakpoint<XBreakpointProperties> xBreakpoint : xBreakpoints) {
addBreakpoint(isolateId, xBreakpoint.getSourcePosition(), new VmServiceConsumers.BreakpointsConsumer() {
@Override
void sourcePositionNotApplicable() {
myBreakpointHandler.breakpointFailed(xBreakpoint);
checkDone();
}
@Override
void received(List<Breakpoint> breakpointResponses, List<RPCError> errorResponses) {
if (breakpointResponses.size() > 0) {
for (Breakpoint breakpoint : breakpointResponses) {
myBreakpointHandler.vmBreakpointAdded(xBreakpoint, isolateId, breakpoint);
}
} else if (errorResponses.size() > 0) {
myBreakpointHandler.breakpointFailed(xBreakpoint);
}
checkDone();
}
private void checkDone() {
if (counter.decrementAndGet() == 0 && onFinished != null) {
onFinished.run();
myVmService.getIsolate(isolateId, new GetIsolateConsumer() {
@Override
public void received(Isolate response) {
final Set<String> libraryUris = new HashSet<>();
final Set<String> fileNames = new HashSet<>();
for (LibraryRef library : response.getLibraries()) {
final String uri = library.getUri();
libraryUris.add(uri);
final String[] split = uri.split("/");
fileNames.add(split[split.length - 1]);
}
final ElementList<Breakpoint> breakpoints = response.getBreakpoints();
if (breakpoints.isEmpty()) {
return;
}
final Set<CanonicalBreakpoint> mappedCanonicalBreakpoints = new HashSet<>();
for (Breakpoint breakpoint : breakpoints) {
Object location = breakpoint.getLocation();
// In JIT mode, locations will be unresolved at this time since files aren't compiled until they are used.
if (location instanceof UnresolvedSourceLocation) {
final ScriptRef script = ((UnresolvedSourceLocation) location).getScript();
if (script != null && libraryUris.contains(script.getUri())) {
mappedCanonicalBreakpoints.add(breakpointNumbersToCanonicalMap.get(breakpoint.getBreakpointNumber()));
}
}
}
final Analytics analytics = FlutterInitializer.getAnalytics();
final String category = "breakpoint";
final Sets.SetView<CanonicalBreakpoint> initialDifference = Sets.difference(canonicalBreakpoints, mappedCanonicalBreakpoints);
final Set<CanonicalBreakpoint> finalDifference = new HashSet<>();
for (CanonicalBreakpoint missingBreakpoint : initialDifference) {
// built. So it's okay to ignore these breakpoints in our count.
if (fileNames.contains(missingBreakpoint.fileName)) {
finalDifference.add(missingBreakpoint);
}
}
analytics.sendEventMetric(category, "unmapped-count", finalDifference.size());
// For internal bazel projects, report files where mapping failed.
if (WorkspaceCache.getInstance(myDebugProcess.getSession().getProject()).isBazel()) {
for (CanonicalBreakpoint canonicalBreakpoint : finalDifference) {
if (canonicalBreakpoint.path.contains("google3")) {
analytics.sendEvent(category, String.format("unmapped-file|%s|%s", response.getRootLib().getUri(), canonicalBreakpoint.path));
}
}
}
}
@Override
public void received(Sentinel response) {
}
@Override
public void onError(RPCError error) {
}
});
}
}
});
}
}
use of org.dartlang.vm.service.element.Sentinel in project flutter-intellij by flutter.
the class CanonicalBreakpoint method getScriptSync.
@Nullable
public Script getScriptSync(@NotNull final String isolateId, @NotNull final String scriptId) {
assertSyncRequestAllowed();
final Semaphore semaphore = new Semaphore();
semaphore.down();
final Ref<Script> resultRef = Ref.create();
addRequest(() -> myVmService.getObject(isolateId, scriptId, new GetObjectConsumer() {
@Override
public void received(Obj script) {
resultRef.set((Script) script);
semaphore.up();
}
@Override
public void received(Sentinel response) {
semaphore.up();
}
@Override
public void onError(RPCError error) {
semaphore.up();
}
}));
semaphore.waitFor(RESPONSE_WAIT_TIMEOUT);
return resultRef.get();
}
Aggregations