From 73e002c1926fa0094283bdc19c03af80bcc66437 Mon Sep 17 00:00:00 2001 From: iridinite Date: Wed, 7 Aug 2024 15:59:09 +0200 Subject: [PATCH 1/2] Fix var-set-format result processing for LLDB Unlike GDB, LLDB-MI has a different result format for var-set-format. It wraps the new value in an array which only ever has one element. --- src/MIDebugEngine/Engine.Impl/Variables.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/MIDebugEngine/Engine.Impl/Variables.cs b/src/MIDebugEngine/Engine.Impl/Variables.cs index 4bae0f861..a757f2650 100644 --- a/src/MIDebugEngine/Engine.Impl/Variables.cs +++ b/src/MIDebugEngine/Engine.Impl/Variables.cs @@ -715,7 +715,12 @@ internal async Task Format() Results results = await _engine.DebuggedProcess.MICommandFactory.VarSetFormat(_internalName, _format, ResultClass.None); if (results.ResultClass == ResultClass.done) { - Value = results.FindString("value"); + // Sample output for LLDB: ^done,changelist=[{name="var1",value="123",in_scope="true",type_changed="false",type_changed="0"}] + // Sample output for GDB: ^done,format="natural",value="123" + if (_engine.DebuggedProcess.LaunchOptions.DebuggerMIMode == MIMode.Lldb) + Value = results.Find("changelist").Content[0].FindString("value"); + else + Value = results.FindString("value"); } else if (results.ResultClass == ResultClass.error) { From b59da0aed0e07405313ffb5f8b30caf5fa70369b Mon Sep 17 00:00:00 2001 From: iridinite Date: Tue, 23 Sep 2025 10:59:47 +0200 Subject: [PATCH 2/2] Address feedback --- src/MIDebugEngine/Engine.Impl/Variables.cs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/MIDebugEngine/Engine.Impl/Variables.cs b/src/MIDebugEngine/Engine.Impl/Variables.cs index a757f2650..55a24796f 100644 --- a/src/MIDebugEngine/Engine.Impl/Variables.cs +++ b/src/MIDebugEngine/Engine.Impl/Variables.cs @@ -715,12 +715,20 @@ internal async Task Format() Results results = await _engine.DebuggedProcess.MICommandFactory.VarSetFormat(_internalName, _format, ResultClass.None); if (results.ResultClass == ResultClass.done) { - // Sample output for LLDB: ^done,changelist=[{name="var1",value="123",in_scope="true",type_changed="false",type_changed="0"}] - // Sample output for GDB: ^done,format="natural",value="123" - if (_engine.DebuggedProcess.LaunchOptions.DebuggerMIMode == MIMode.Lldb) - Value = results.Find("changelist").Content[0].FindString("value"); + if (results.Contains("value")) + { + // Sample output for GDB: ^done,format="natural",value="123" + this.Value = results.FindString("value"); + } + else if (results.TryFind("changelist", out ValueListValue changeList)) + { + // Sample output for LLDB: ^done,changelist=[{name="var1",value="123",in_scope="true",type_changed="false",type_changed="0"}] + this.Value = changeList.Content[0].FindString("value"); + } else - Value = results.FindString("value"); + { + throw new MIResultFormatException("value", results); + } } else if (results.ResultClass == ResultClass.error) {