@@ -190,16 +190,20 @@ void GdbMiAdapter::UpdateAllRegisters() {
190190
191191 for (size_t i = 0 ; i < gdbmiregisters[" register-values" ].size (); i++)
192192 {
193- auto gdbmi_reg = gdbmiregisters[" register-values" ][i];
194- auto reg_idx = std::stoul (gdbmi_reg[" number" ].GetString (), 0 , 10 );
195- auto reg_value = ParseGdbValue (gdbmi_reg[" value" ].GetString ());
196- if (reg_idx < m_registerNames.size ())
197- {
198- std::string name = m_registerNames[reg_idx];
199- if (!name.empty ())
193+ try {
194+ auto gdbmi_reg = gdbmiregisters[" register-values" ][i];
195+ auto reg_idx = std::stoul (gdbmi_reg[" number" ].GetString (), 0 , 10 );
196+ auto reg_value = ParseGdbValue (gdbmi_reg[" value" ].GetString ());
197+ if (reg_idx < m_registerNames.size ())
200198 {
201- regs[name] = DebugRegister (name, reg_value, 0 , reg_idx);
199+ std::string name = m_registerNames[reg_idx];
200+ if (!name.empty ())
201+ {
202+ regs[name] = DebugRegister (name, reg_value, 0 , reg_idx);
203+ }
202204 }
205+ } catch (...) {
206+ LogWarn (" Failed to parse register value at index %zu" , i);
203207 }
204208 }
205209
@@ -222,15 +226,19 @@ void GdbMiAdapter::UpdateStackFrames(uint32_t tid) {
222226 auto gdbmi_frames = MiValue::Parse (result.payload );
223227 for (size_t i = 0 ; i < gdbmi_frames[" stack" ].size (); ++i)
224228 {
225- auto parsed_frame = gdbmi_frames[" stack" ][i];
226- auto debug_frame = DebugFrame (i,
227- std::stoull (parsed_frame[" frame" ][" addr" ].GetString (), 0 , 16 ),
228- 0 ,
229- 0 ,
230- parsed_frame[" frame" ][" func" ].GetString (),
231- 0 ,
232- " n/a" );
233- frames.push_back (debug_frame);
229+ try {
230+ auto parsed_frame = gdbmi_frames[" stack" ][i];
231+ auto debug_frame = DebugFrame (i,
232+ std::stoull (parsed_frame[" frame" ][" addr" ].GetString (), 0 , 16 ),
233+ 0 ,
234+ 0 ,
235+ parsed_frame[" frame" ][" func" ].GetString (),
236+ 0 ,
237+ " n/a" );
238+ frames.push_back (debug_frame);
239+ } catch (...) {
240+ LogWarn (" Failed to parse stack frame %zu" , i);
241+ }
234242 }
235243
236244 std::unique_lock cacheLock (m_cacheMutex);
@@ -894,10 +902,18 @@ std::vector<DebugBreakpoint> GdbMiAdapter::GetBreakpointList() const {
894902 for (const auto & item: bp_table[" body" ].GetList ())
895903 {
896904 auto bp = item[" bkpt" ];
897- uint64_t addr = std::stoull (bp[" addr" ].GetString (), 0 , 16 );
898- uint64_t id = std::stoull (bp[" number" ].GetString (), 0 , 10 );
899- LogDebug (" Parsed breakpoint %" PRIu64 " at 0x%" PRIx64, id, addr);
900- breakpoints.emplace_back (addr, id, true );
905+ // addr may be "<MULTIPLE>" or "<PENDING>" for multi-location/pending breakpoints
906+ std::string addrStr = bp[" addr" ].GetString ();
907+ if (addrStr.empty () || addrStr[0 ] == ' <' )
908+ continue ;
909+ try {
910+ uint64_t addr = std::stoull (addrStr, 0 , 16 );
911+ uint64_t id = std::stoull (bp[" number" ].GetString (), 0 , 10 );
912+ LogDebug (" Parsed breakpoint %" PRIu64 " at 0x%" PRIx64, id, addr);
913+ breakpoints.emplace_back (addr, id, true );
914+ } catch (...) {
915+ LogWarn (" Failed to parse breakpoint entry" );
916+ }
901917 }
902918 }
903919 }
0 commit comments