From 2cf04cb248c6b061b5b0aac1f808fdbb72602de3 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Tue, 28 Aug 2012 12:39:57 -0500 Subject: [PATCH] Fix register view with GDB. Because missing registers are discarded, the register number returned by GDB (when values are obtained) are not the same as the indices into the internal list of registers. Explicitly store this mapping now. Task-number: QTCREATORBUG-7468 Change-Id: Ica6fc6e6bd0a240cbd59923e4cabc7127e1aad8b Reviewed-by: hjk --- src/plugins/debugger/gdb/gdbengine.cpp | 23 +++++++++++++++++++---- src/plugins/debugger/gdb/gdbengine.h | 1 + 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 161d48c424a..7af0a9ced5b 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -3770,9 +3770,23 @@ void GdbEngine::handleRegisterListNames(const GdbResponse &response) } Registers registers; - foreach (const GdbMi &item, response.data.findChild("register-names").children()) - if (!item.data().isEmpty()) + int gdbRegisterNumber = 0, internalIndex = 0; + + // This both handles explicitly having space for all the registers and + // initializes all indices to 0, giving missing registers a sane default + // in the event of something wacky. + GdbMi names = response.data.findChild("register-names"); + m_registerNumbers.resize(names.childCount()); + foreach (const GdbMi &item, names.children()) { + // Since we throw away missing registers to eliminate empty rows + // we need to maintain a mapping of GDB register numbers to their + // respective indices in the register list. + if (!item.data().isEmpty()) { + m_registerNumbers[gdbRegisterNumber] = internalIndex++; registers.append(Register(item.data())); + } + gdbRegisterNumber++; + } registerHandler()->setRegisters(registers); } @@ -3784,14 +3798,15 @@ void GdbEngine::handleRegisterListValues(const GdbResponse &response) Registers registers = registerHandler()->registers(); const int registerCount = registers.size(); + const int gdbRegisterCount = m_registerNumbers.size(); // 24^done,register-values=[{number="0",value="0xf423f"},...] const GdbMi values = response.data.findChild("register-values"); QTC_ASSERT(registerCount == values.children().size(), return); foreach (const GdbMi &item, values.children()) { const int number = item.findChild("number").data().toInt(); - if (number >= 0 && number < registerCount) - registers[number].value = item.findChild("value").data(); + if (number >= 0 && number < gdbRegisterCount) + registers[m_registerNumbers[number]].value = item.findChild("value").data(); } registerHandler()->setAndMarkRegisters(registers); } diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 18adc7fc17f..cdb76eb60a2 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -495,6 +495,7 @@ private: ////////// View & Data Stuff ////////// void setRegisterValue(int nr, const QString &value); void handleRegisterListNames(const GdbResponse &response); void handleRegisterListValues(const GdbResponse &response); + QVector m_registerNumbers; // Map GDB register numbers to indices // // Disassembler specific stuff