Skip to content

Commit acf883e

Browse files
committed
Fix a crash when toggling breakpoints with GDB MI adapter
1 parent 052dc6c commit acf883e

1 file changed

Lines changed: 37 additions & 21 deletions

File tree

core/adapters/gdbmiadapter.cpp

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)