diff --git a/platform/xdebugger-impl/backend/src/com/intellij/platform/debugger/impl/backend/BackendXExecutionStackApi.kt b/platform/xdebugger-impl/backend/src/com/intellij/platform/debugger/impl/backend/BackendXExecutionStackApi.kt index 8fb9ec14f994..a84571b57be3 100644 --- a/platform/xdebugger-impl/backend/src/com/intellij/platform/debugger/impl/backend/BackendXExecutionStackApi.kt +++ b/platform/xdebugger-impl/backend/src/com/intellij/platform/debugger/impl/backend/BackendXExecutionStackApi.kt @@ -12,8 +12,6 @@ import com.intellij.platform.debugger.impl.rpc.XStackFrameId import com.intellij.platform.debugger.impl.rpc.XStackFramePresentation import com.intellij.platform.debugger.impl.rpc.XStackFramePresentationFragment import com.intellij.platform.debugger.impl.rpc.XStackFramesEvent -import com.intellij.platform.debugger.impl.rpc.toRpc -import com.intellij.xdebugger.frame.XExecutionStack import com.intellij.xdebugger.frame.XStackFrame import com.intellij.xdebugger.impl.frame.XStackFrameContainerEx import com.intellij.xdebugger.impl.rpc.models.findValue @@ -61,8 +59,11 @@ internal class BackendXExecutionStackApi : XExecutionStackApi { val frameDtos = framesCopy.map { frame -> frame.toRpc(executionStackModel.coroutineScope, session) } - val frameToSelect = toSelect?.toRpc(executionStackModel.coroutineScope, session) - trySend(XStackFramesEvent.XNewStackFrames(frameDtos, frameToSelect, last)) + val frameToSelectId = toSelect?.let { + val index = framesCopy.indexOf(it) + if (index >= 0) frameDtos[index].stackFrameId else null + } + trySend(XStackFramesEvent.XNewStackFrames(frameDtos, frameToSelectId, last)) val framesWithIds = frameDtos.zip(framesCopy) { dto, frame -> dto.stackFrameId to frame } subscribeToPresentationUpdates(executionStackId, framesWithIds, last) } diff --git a/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/frame/FrontendXExecutionStack.kt b/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/frame/FrontendXExecutionStack.kt index 29e6321414ab..4eedc72da7f9 100644 --- a/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/frame/FrontendXExecutionStack.kt +++ b/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/frame/FrontendXExecutionStack.kt @@ -65,11 +65,14 @@ internal class FrontendXExecutionStack( // But it requires further investigation. val feFrames = event.frames.map { suspendContextLifetimeScope.getOrCreateStackFrame(it, project) } if (container is XStackFrameContainerEx) { - val frameToSelect = event.frameToSelect?.let { suspendContextLifetimeScope.getOrCreateStackFrame(it, project) } + val frameToSelect = event.frameToSelectId?.let { frameToSelectId -> + feFrames.firstOrNull { it.id == frameToSelectId } + } container.addStackFrames(feFrames, frameToSelect, event.last) } - else + else { container.addStackFrames(feFrames, event.last) + } } is XStackFramesEvent.NewPresentation -> { val frame = suspendContextLifetimeScope.findStackFrame(event.stackFrameId) diff --git a/platform/xdebugger-impl/rpc/src/com/intellij/platform/debugger/impl/rpc/XStackTraceDto.kt b/platform/xdebugger-impl/rpc/src/com/intellij/platform/debugger/impl/rpc/XStackTraceDto.kt index 265a50ada474..bcda7791bacb 100644 --- a/platform/xdebugger-impl/rpc/src/com/intellij/platform/debugger/impl/rpc/XStackTraceDto.kt +++ b/platform/xdebugger-impl/rpc/src/com/intellij/platform/debugger/impl/rpc/XStackTraceDto.kt @@ -16,7 +16,7 @@ import org.jetbrains.annotations.ApiStatus sealed interface XStackFramesEvent { @ApiStatus.Internal @Serializable - data class XNewStackFrames(val frames: List, val frameToSelect : XStackFrameDto?, val last: Boolean) : XStackFramesEvent + data class XNewStackFrames(val frames: List, val frameToSelectId: XStackFrameId?, val last: Boolean) : XStackFramesEvent @Serializable data class ErrorOccurred(val errorMessage: @NlsContexts.DialogMessage String) : XStackFramesEvent diff --git a/platform/xdebugger-impl/ui/src/com/intellij/xdebugger/impl/frame/XSplitterWatchesViewImpl.kt b/platform/xdebugger-impl/ui/src/com/intellij/xdebugger/impl/frame/XSplitterWatchesViewImpl.kt index 7451fc3164b5..3831caf9cdbb 100644 --- a/platform/xdebugger-impl/ui/src/com/intellij/xdebugger/impl/frame/XSplitterWatchesViewImpl.kt +++ b/platform/xdebugger-impl/ui/src/com/intellij/xdebugger/impl/frame/XSplitterWatchesViewImpl.kt @@ -23,6 +23,8 @@ import javax.swing.JComponent import javax.swing.JPanel import kotlin.time.Duration.Companion.milliseconds +private val LOG = com.intellij.openapi.diagnostic.logger() + /** * Allows customizing of variables view and splitting into 2 components. * Notice that you must provide the bottom component of the view by implementing XDebugSessionTabCustomizer in your XDebugProcess @@ -63,7 +65,8 @@ class XSplitterWatchesViewImpl( try { withContext(Dispatchers.EDT) { updateView() } } - catch (_: Throwable) { + catch (ex: Throwable) { + LOG.warn("Failed to update watches view", ex) } } }