diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java index fe9c056a436d..dc11655fb4e3 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java @@ -28,6 +28,8 @@ import com.intellij.debugger.requests.Requestor; import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.debugger.ui.breakpoints.Breakpoint; import com.intellij.debugger.ui.breakpoints.StackCapturingLineBreakpoint; +import com.intellij.debugger.ui.overhead.OverheadProducer; +import com.intellij.debugger.ui.overhead.OverheadTimings; import com.intellij.execution.configurations.RemoteConnection; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; @@ -476,6 +478,10 @@ public class DebugProcessEvents extends DebugProcessImpl { boolean resumePreferred = requestor != null && DebuggerSettings.SUSPEND_NONE.equals(requestor.getSuspendPolicy()); boolean requestHit; + long start = 0; + if (requestor instanceof OverheadProducer) { + start = System.currentTimeMillis(); + } try { requestHit = (requestor != null) && requestor.processLocatableEvent(this, event); } @@ -492,6 +498,11 @@ public class DebugProcessEvents extends DebugProcessImpl { requestHit = considerRequestHit[0]; resumePreferred = !requestHit; } + finally { + if (requestor instanceof OverheadProducer) { + OverheadTimings.add(DebugProcessEvents.this, (OverheadProducer)requestor, System.currentTimeMillis() - start); + } + } if (requestHit && requestor instanceof Breakpoint) { // if requestor is a breakpoint and this breakpoint was hit, no matter its suspend policy diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java index 7ee002caf789..423a8f537672 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java @@ -33,8 +33,8 @@ import com.intellij.debugger.jdi.ThreadReferenceProxyImpl; import com.intellij.debugger.requests.ClassPrepareRequestor; import com.intellij.debugger.requests.Requestor; import com.intellij.debugger.settings.DebuggerSettings; -import com.intellij.debugger.ui.overhead.OverheadTimings; import com.intellij.debugger.ui.impl.watch.CompilingEvaluatorImpl; +import com.intellij.debugger.ui.overhead.OverheadProducer; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.project.Project; @@ -73,7 +73,7 @@ import java.util.Arrays; import java.util.Objects; import java.util.function.Function; -public abstract class Breakpoint
implements FilteredRequestor, ClassPrepareRequestor { +public abstract class Breakpoint
implements FilteredRequestor, ClassPrepareRequestor, OverheadProducer {
public static final Key implements
@Override
public boolean processLocatableEvent(SuspendContextCommandImpl action, LocatableEvent event) throws EventProcessingException {
- long start = System.currentTimeMillis();
-
SuspendContextImpl context = action.getSuspendContext();
if (!isValid()) {
context.getDebugProcess().getRequestsManager().deleteRequest(this);
return false;
}
+ String title = DebuggerBundle.message("title.error.evaluating.breakpoint.condition");
+
try {
- String title = DebuggerBundle.message("title.error.evaluating.breakpoint.condition");
-
- try {
- StackFrameProxyImpl frameProxy = context.getThread().frame(0);
- if (frameProxy == null) {
- // might be if the thread has been collected
- return false;
- }
-
- EvaluationContextImpl evaluationContext = new EvaluationContextImpl(context, frameProxy, () -> getThisObject(context, event));
-
- if (!evaluateCondition(evaluationContext, event)) {
- return false;
- }
-
- title = DebuggerBundle.message("title.error.evaluating.breakpoint.action");
- runAction(evaluationContext, event);
- }
- catch (final EvaluateException ex) {
- if (ApplicationManager.getApplication().isUnitTestMode()) {
- System.out.println(ex.getMessage());
- return false;
- }
-
- throw new EventProcessingException(title, ex.getMessage(), ex);
+ StackFrameProxyImpl frameProxy = context.getThread().frame(0);
+ if (frameProxy == null) {
+ // might be if the thread has been collected
+ return false;
}
- return true;
+ EvaluationContextImpl evaluationContext = new EvaluationContextImpl(context, frameProxy, () -> getThisObject(context, event));
+
+ if (!evaluateCondition(evaluationContext, event)) {
+ return false;
+ }
+
+ title = DebuggerBundle.message("title.error.evaluating.breakpoint.action");
+ runAction(evaluationContext, event);
}
- finally {
- OverheadTimings.add(context.getDebugProcess(), this, System.currentTimeMillis() - start);
+ catch (final EvaluateException ex) {
+ if (ApplicationManager.getApplication().isUnitTestMode()) {
+ System.out.println(ex.getMessage());
+ return false;
+ }
+
+ throw new EventProcessingException(title, ex.getMessage(), ex);
}
+
+ return true;
}
private void runAction(EvaluationContextImpl context, LocatableEvent event) {
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/StackCapturingLineBreakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/StackCapturingLineBreakpoint.java
index e23da2fbbd25..a23a7ac6fbe9 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/StackCapturingLineBreakpoint.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/StackCapturingLineBreakpoint.java
@@ -180,6 +180,22 @@ public class StackCapturingLineBreakpoint extends WildcardMethodBreakpoint {
}
}
+ @Override
+ public String getDisplayName() {
+ return "Capture point at " + myCapturePoint.myClassName + "." + myCapturePoint.myMethodName;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return myCapturePoint.myEnabled;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ myCapturePoint.myEnabled = enabled;
+ DebuggerSettings.getInstance().setCapturePoints(DebuggerSettings.getInstance().getCapturePoints()); // to fire change event
+ }
+
private static void track(DebugProcessImpl debugProcess, CapturePoint capturePoint) {
StackCapturingLineBreakpoint breakpoint = new StackCapturingLineBreakpoint(debugProcess.getProject(), capturePoint);
breakpoint.createRequest(debugProcess);
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadProducer.java b/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadProducer.java
new file mode 100644
index 000000000000..a79ad0f31475
--- /dev/null
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadProducer.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2000-2017 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.debugger.ui.overhead;
+
+/**
+ * @author egor
+ */
+public interface OverheadProducer {
+ boolean isEnabled();
+ void setEnabled(boolean enabled);
+ String getDisplayName();
+}
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadTimings.java b/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadTimings.java
index aff39c23c71b..d126a1f4fbad 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadTimings.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadTimings.java
@@ -15,10 +15,11 @@
*/
package com.intellij.debugger.ui.overhead;
-import com.intellij.debugger.engine.DebugProcessImpl;
+import com.intellij.debugger.engine.DebugProcess;
import com.intellij.openapi.util.Key;
import com.intellij.util.EventDispatcher;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.EventListener;
import java.util.Map;
@@ -32,30 +33,36 @@ public class OverheadTimings {
public static final Key