diff --git a/MODULE.bazel b/MODULE.bazel index 225917e995e0..85fabd92bd86 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -49,8 +49,8 @@ kotlin_test_deps(name = "kotlin_test_deps") http_file( name = "debugger_test_deps_debugger_agent", downloaded_file_path = "debugger-agent.jar", - sha256 = "b425c8604b860f7febe09809a7256f5f6209ac8f778ac27cc5ec1de328b3d1cb", - url = "https://cache-redirector.jetbrains.com/packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/intellij/deps/debugger-agent/1.131/debugger-agent-1.131.jar", + sha256 = "d08d14bf727e3a393dc9e0f95b86b3483d32c15027673324558a13d4eee3756e", + url = "https://cache-redirector.jetbrains.com/packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/intellij/deps/debugger-agent/1.133/debugger-agent-1.133.jar", ) jbr_toolchains = use_extension("@community//build:jbr-toolchains.bzl", "jbr_toolchains") diff --git a/java/debugger/debugger-agent/intellij.java.debugger.agent.holder.iml b/java/debugger/debugger-agent/intellij.java.debugger.agent.holder.iml index 35a64b6fa9d4..856383befc71 100644 --- a/java/debugger/debugger-agent/intellij.java.debugger.agent.holder.iml +++ b/java/debugger/debugger-agent/intellij.java.debugger.agent.holder.iml @@ -7,19 +7,19 @@ - + - - b425c8604b860f7febe09809a7256f5f6209ac8f778ac27cc5ec1de328b3d1cb + + d08d14bf727e3a393dc9e0f95b86b3483d32c15027673324558a13d4eee3756e - + - + diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/AsyncStacksUtils.java b/java/debugger/impl/src/com/intellij/debugger/engine/AsyncStacksUtils.java index 94af1ffc7549..91a01573060d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/AsyncStacksUtils.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/AsyncStacksUtils.java @@ -1,6 +1,7 @@ // Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.debugger.engine; +import com.intellij.debugger.JavaDebuggerBundle; import com.intellij.debugger.SourcePosition; import com.intellij.debugger.engine.evaluation.EvaluateException; import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; @@ -38,10 +39,16 @@ import com.intellij.platform.eel.EelDescriptor; import com.intellij.platform.eel.provider.EelProviderUtil; import com.intellij.platform.eel.provider.LocalEelDescriptor; import com.intellij.platform.eel.provider.utils.EelPathUtils; +import com.intellij.ui.ColoredTextContainer; +import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.BazelEnvironmentUtil; import com.intellij.util.SlowOperations; import com.intellij.util.containers.ContainerUtil; +import com.intellij.xdebugger.frame.XCompositeNode; +import com.intellij.xdebugger.frame.XStackFrame; +import com.intellij.xdebugger.frame.XValueChildrenList; import com.intellij.xdebugger.impl.XDebugSessionImpl; +import com.intellij.xdebugger.impl.frame.XStackFrameWithSeparatorAbove; import com.sun.jdi.*; import com.sun.jdi.event.LocatableEvent; import org.jetbrains.annotations.ApiStatus; @@ -189,8 +196,13 @@ public final class AsyncStacksUtils { String className = dis.readUTF(); String methodName = dis.readUTF(); int line = dis.readInt(); - Location location = DebuggerUtilsEx.findOrCreateLocation(vm.getVirtualMachine(), className, methodName, line); - item = new StackFrameItem(location, null); + if ("< Unknown".equals(className) && "Stack > ".equals(methodName)) { + item = new ThrottledStackFrameItem(vm.getVirtualMachine()); + } + else { + Location location = DebuggerUtilsEx.findOrCreateLocation(vm.getVirtualMachine(), className, methodName, line); + item = new StackFrameItem(location, null); + } } res.add(item); } @@ -497,6 +509,8 @@ public final class AsyncStacksUtils { if (isSuspendHelperEnabled()) { properties.setProperty("suspendHelper", "true"); } + boolean throttling = DebuggerSettings.getInstance().AGENT_THROTTLING; + properties.setProperty("throttling", Boolean.toString(throttling)); double overhead = Registry.doubleValue("debugger.async.stack.trace.overhead.percent"); properties.setProperty("overheadPercent", Double.toString(overhead)); if (JavaCollectionBreakpointType.isEnabled()) { @@ -532,4 +546,60 @@ public final class AsyncStacksUtils { breakpoint.setSuspendPolicy(DebuggerSettings.SUSPEND_THREAD); breakpoint.createRequest(process); } + + private static class ThrottledStackFrameItem extends StackFrameItem { + ThrottledStackFrameItem(VirtualMachine vm) { + super(createSyntheticLocation(vm), Collections.emptyList()); + } + + private static Location createSyntheticLocation(VirtualMachine vm) { + return DebuggerUtilsEx.findOrCreateLocation(vm, "", "", -1); + } + + @Override + public XStackFrame createFrame(@NotNull DebugProcessImpl debugProcess, @Nullable SourcePosition sourcePosition) { + return new ThrottledFrame(); + } + } + + private static class ThrottledFrame extends XStackFrame implements XStackFrameWithSeparatorAbove, JVMStackFrameInfoProvider { + private boolean myWithSeparator; + + @Override + public void customizePresentation(@NotNull ColoredTextContainer component) { + component.append(JavaDebuggerBundle.message("async.stack.throttled.frame.label"), SimpleTextAttributes.GRAY_ITALIC_ATTRIBUTES); + } + + @Override + public void computeChildren(@NotNull XCompositeNode node) { + node.setMessage(JavaDebuggerBundle.message("async.stack.throttled.frame.info"), null, + SimpleTextAttributes.REGULAR_ATTRIBUTES, StackFrameItem.CAPTURE_SETTINGS_OPENER); + node.addChildren(XValueChildrenList.EMPTY, true); + } + + @Override + public String getCaptionAboveOf() { + return StackFrameItem.getAsyncStacktraceMessage(); + } + + @Override + public boolean hasSeparatorAbove() { + return myWithSeparator; + } + + @Override + public void setWithSeparator(boolean withSeparator) { + myWithSeparator = withSeparator; + } + + @Override + public boolean isSynthetic() { + return true; + } + + @Override + public boolean isInLibraryContent() { + return false; + } + } } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/CaptureConfigurable.form b/java/debugger/impl/src/com/intellij/debugger/settings/CaptureConfigurable.form index f85d5ac7fc1c..ba2a13d8feeb 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/CaptureConfigurable.form +++ b/java/debugger/impl/src/com/intellij/debugger/settings/CaptureConfigurable.form @@ -1,6 +1,6 @@
- + @@ -29,9 +29,17 @@ + + + + + + + + - + diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/CaptureConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/CaptureConfigurable.java index 77f6a95910ba..bb991b06bab7 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/CaptureConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/CaptureConfigurable.java @@ -66,6 +66,7 @@ public final class CaptureConfigurable implements SearchableConfigurable, NoScro private final Project myProject; private JCheckBox myDebuggerAgent; + private JCheckBox myThrottling; private JButton myConfigureAnnotationsButton; private JPanel myCapturePanel; private MyTableModel myTableModel; @@ -444,6 +445,7 @@ public final class CaptureConfigurable implements SearchableConfigurable, NoScro public boolean isModified() { return DebuggerSettings.getInstance().CAPTURE_VARIABLES != myCaptureVariables.isSelected() || DebuggerSettings.getInstance().INSTRUMENTING_AGENT != myDebuggerAgent.isSelected() || + DebuggerSettings.getInstance().AGENT_THROTTLING != myThrottling.isSelected() || !DebuggerSettings.getInstance().getCapturePoints().equals(myTableModel.myCapturePoints); } @@ -452,12 +454,14 @@ public final class CaptureConfigurable implements SearchableConfigurable, NoScro DebuggerSettings.getInstance().setCapturePoints(myTableModel.myCapturePoints); DebuggerSettings.getInstance().CAPTURE_VARIABLES = myCaptureVariables.isSelected(); DebuggerSettings.getInstance().INSTRUMENTING_AGENT = myDebuggerAgent.isSelected(); + DebuggerSettings.getInstance().AGENT_THROTTLING = myThrottling.isSelected(); } @Override public void reset() { myCaptureVariables.setSelected(DebuggerSettings.getInstance().CAPTURE_VARIABLES); myDebuggerAgent.setSelected(DebuggerSettings.getInstance().INSTRUMENTING_AGENT); + myThrottling.setSelected(DebuggerSettings.getInstance().AGENT_THROTTLING); myTableModel.myCapturePoints = DebuggerSettings.getInstance().cloneCapturePoints(); myTableModel.fireTableDataChanged(); } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettingsStatisticsCollector.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettingsStatisticsCollector.java index 700691373440..2312b1bb6319 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettingsStatisticsCollector.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettingsStatisticsCollector.java @@ -14,7 +14,7 @@ import java.util.Set; import static com.intellij.internal.statistic.beans.MetricEventUtilKt.addBoolIfDiffers; public final class DebuggerSettingsStatisticsCollector extends ApplicationUsagesCollector { - private static final EventLogGroup GROUP = new EventLogGroup("debugger.settings.ide", 7); + private static final EventLogGroup GROUP = new EventLogGroup("debugger.settings.ide", 8); private static final VarargEventId SHOW_ALTERNATIVE_SOURCE = GROUP.registerVarargEvent("showAlternativeSource", EventFields.Enabled); private static final VarargEventId HOTSWAP_IN_BACKROUND = GROUP.registerVarargEvent("hotswapInBackround", EventFields.Enabled); @@ -32,6 +32,7 @@ public final class DebuggerSettingsStatisticsCollector extends ApplicationUsages private static final VarargEventId RESUME_ONLY_CURRENT_THREAD = GROUP.registerVarargEvent("resumeOnlyCurrentThread", EventFields.Enabled); private static final VarargEventId HIDE_STACK_FRAMES_USING_STEPPING_FILTER = GROUP.registerVarargEvent("hideStackFramesUsingSteppingFilter", EventFields.Enabled); private static final VarargEventId INSTRUMENTING_AGENT = GROUP.registerVarargEvent("instrumentingAgent", EventFields.Enabled); + private static final VarargEventId AGENT_THROTTLING = GROUP.registerVarargEvent("agentThrottling", EventFields.Enabled); @Override public EventLogGroup getGroup() { @@ -60,6 +61,7 @@ public final class DebuggerSettingsStatisticsCollector extends ApplicationUsages addBoolIfDiffers(set, settings, sDefault, s -> s.RESUME_ONLY_CURRENT_THREAD, RESUME_ONLY_CURRENT_THREAD); addBoolIfDiffers(set, settings, sDefault, s -> s.HIDE_STACK_FRAMES_USING_STEPPING_FILTER, HIDE_STACK_FRAMES_USING_STEPPING_FILTER); addBoolIfDiffers(set, settings, sDefault, s -> s.INSTRUMENTING_AGENT, INSTRUMENTING_AGENT); + addBoolIfDiffers(set, settings, sDefault, s -> s.AGENT_THROTTLING, AGENT_THROTTLING); return set; } diff --git a/java/debugger/openapi/resources/messages/JavaDebuggerBundle.properties b/java/debugger/openapi/resources/messages/JavaDebuggerBundle.properties index 3ca800d981d2..ed697afe7a11 100644 --- a/java/debugger/openapi/resources/messages/JavaDebuggerBundle.properties +++ b/java/debugger/openapi/resources/messages/JavaDebuggerBundle.properties @@ -555,6 +555,9 @@ column.name.shallow.size=Shallow Size column.name.retained.size=Retained Size stepping.filter.real.thread.name=thread {0} debugger.variables.not.available.in.async=Variables are not available for async stack frames +async.stack.throttled.frame.label=Async frames are omitted +async.stack.throttled.frame.info=Async stack trace was not collected due to performance overhead. You can disable throttling in +label.capture.configurable.throttling=Throttling exception=Exception ref=Ref thread.dump.during.previous.dump.evaluation.warning=Evaluation of the previous dump is still in progress. Java platform thread dump is taken. diff --git a/java/debugger/shared/src/com/intellij/debugger/settings/DebuggerSettings.java b/java/debugger/shared/src/com/intellij/debugger/settings/DebuggerSettings.java index a411d1cb2203..6288727cba5a 100644 --- a/java/debugger/shared/src/com/intellij/debugger/settings/DebuggerSettings.java +++ b/java/debugger/shared/src/com/intellij/debugger/settings/DebuggerSettings.java @@ -107,6 +107,7 @@ public final class DebuggerSettings implements Cloneable, PersistentStateCompone private ClassFilter[] mySteppingFilters = DEFAULT_STEPPING_FILTERS; public boolean INSTRUMENTING_AGENT = true; + public boolean AGENT_THROTTLING = true; private List myCapturePoints = new ArrayList<>(); public boolean CAPTURE_VARIABLES; private final EventDispatcher myDispatcher = EventDispatcher.create(CapturePointsSettingsListener.class); diff --git a/lib/BUILD.bazel b/lib/BUILD.bazel index 50509596baba..4876c28fc476 100644 --- a/lib/BUILD.bazel +++ b/lib/BUILD.bazel @@ -7062,17 +7062,17 @@ jvm_import( ) copy_file( - name = "org.jetbrains.intellij.deps/debugger-agent-1.131.jar_copy", - src = "@org_jetbrains_intellij_deps-debugger-agent-1_131_http//file", - out = "org.jetbrains.intellij.deps/debugger-agent-1.131.jar", + name = "org.jetbrains.intellij.deps/debugger-agent-1.133.jar_copy", + src = "@org_jetbrains_intellij_deps-debugger-agent-1_133_http//file", + out = "org.jetbrains.intellij.deps/debugger-agent-1.133.jar", allow_symlink = True, visibility = ["//visibility:public"] ) jvm_import( name = "java-debugger-agent-holder-debugger-agent", - jar = "@org_jetbrains_intellij_deps-debugger-agent-1_131_http//file", - source_jar = "@org_jetbrains_intellij_deps-debugger-agent-1_131-sources_http//file", + jar = "@org_jetbrains_intellij_deps-debugger-agent-1_133_http//file", + source_jar = "@org_jetbrains_intellij_deps-debugger-agent-1_133-sources_http//file", visibility = ["//visibility:public"] ) diff --git a/lib/MODULE.bazel b/lib/MODULE.bazel index cb8afd95e412..e7912621b3cf 100644 --- a/lib/MODULE.bazel +++ b/lib/MODULE.bazel @@ -5740,17 +5740,17 @@ http_file( ) http_file( - name = "org_jetbrains_intellij_deps-debugger-agent-1_131_http", - url = "https://cache-redirector.jetbrains.com/packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/intellij/deps/debugger-agent/1.131/debugger-agent-1.131.jar", - sha256 = "b425c8604b860f7febe09809a7256f5f6209ac8f778ac27cc5ec1de328b3d1cb", - downloaded_file_path = "debugger-agent-1.131.jar" + name = "org_jetbrains_intellij_deps-debugger-agent-1_133_http", + url = "https://cache-redirector.jetbrains.com/packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/intellij/deps/debugger-agent/1.133/debugger-agent-1.133.jar", + sha256 = "d08d14bf727e3a393dc9e0f95b86b3483d32c15027673324558a13d4eee3756e", + downloaded_file_path = "debugger-agent-1.133.jar" ) http_file( - name = "org_jetbrains_intellij_deps-debugger-agent-1_131-sources_http", - url = "https://cache-redirector.jetbrains.com/packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/intellij/deps/debugger-agent/1.131/debugger-agent-1.131-sources.jar", - sha256 = "aa2e39240206e88c23f2dd891c2252e297ed6d8afc9302c393027efa305f0689", - downloaded_file_path = "debugger-agent-1.131-sources.jar" + name = "org_jetbrains_intellij_deps-debugger-agent-1_133-sources_http", + url = "https://cache-redirector.jetbrains.com/packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/intellij/deps/debugger-agent/1.133/debugger-agent-1.133-sources.jar", + sha256 = "cd0d9ab32ca1ebebc4f662bf08df315e64fdeba5358d1bcc625a90f742d1260f", + downloaded_file_path = "debugger-agent-1.133-sources.jar" ) http_file(