From 8c956abedd392f48d8cbeea5fea0fcb3e8ef6e36 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 29 Sep 2010 16:39:46 +0200 Subject: [PATCH] Debugger[TRK]: Report crashs with signals. Show the message box correctly on signal 11 reported. Reviewed-by: hjk --- src/plugins/debugger/gdb/symbian.cpp | 4 ++-- src/plugins/debugger/gdb/symbian.h | 8 +++++++- src/plugins/debugger/gdb/tcftrkgdbadapter.cpp | 8 ++++++-- src/plugins/debugger/gdb/tcftrkgdbadapter.h | 1 + src/plugins/debugger/gdb/trkgdbadapter.cpp | 9 ++++++--- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/plugins/debugger/gdb/symbian.cpp b/src/plugins/debugger/gdb/symbian.cpp index f7d6b62f282..4cae2ce81bc 100644 --- a/src/plugins/debugger/gdb/symbian.cpp +++ b/src/plugins/debugger/gdb/symbian.cpp @@ -418,9 +418,9 @@ static void gdbAppendRegister(QByteArray *ba, uint regno, uint value) ba->append(';'); } -QByteArray Snapshot::gdbStopMessage(uint threadId, bool reportThreadId) const +QByteArray Snapshot::gdbStopMessage(uint threadId, int signalNumber, bool reportThreadId) const { - QByteArray ba = "T05"; + QByteArray ba = ('T' + trk::hexNumber(signalNumber, 2)); if (reportThreadId) { ba += "thread:"; ba += trk::hexNumber(threadId, 3); diff --git a/src/plugins/debugger/gdb/symbian.h b/src/plugins/debugger/gdb/symbian.h index 30012183c53..ec34462e47a 100644 --- a/src/plugins/debugger/gdb/symbian.h +++ b/src/plugins/debugger/gdb/symbian.h @@ -73,6 +73,12 @@ struct MemoryRange QDebug operator<<(QDebug d, const MemoryRange &range); +// Signals to be passed to gdb server as stop reason (2 digit hex) +enum GdbServerStopReason { + gdbServerSignalTrap = 5, // Trap/Breakpoint, etc. + gdbServerSignalSegfault = 11 // Segfault +}; + namespace Symbian { enum CodeMode @@ -135,7 +141,7 @@ struct Snapshot QByteArray gdbQsThreadInfo() const; QByteArray gdbQThreadExtraInfo(const QByteArray &cmd) const; // Format a gdb T05 stop message with thread and register set - QByteArray gdbStopMessage(uint threadId, bool reportThreadId) const; + QByteArray gdbStopMessage(uint threadId, int signalNumber, bool reportThreadId) const; // Format a log message for memory access with some smartness about registers QByteArray memoryReadLogMessage(uint addr, uint threadId, bool verbose, const QByteArray &ba) const; // Gdb command parse helpers: 'salnext' diff --git a/src/plugins/debugger/gdb/tcftrkgdbadapter.cpp b/src/plugins/debugger/gdb/tcftrkgdbadapter.cpp index cad69ff297e..1169da30f0a 100644 --- a/src/plugins/debugger/gdb/tcftrkgdbadapter.cpp +++ b/src/plugins/debugger/gdb/tcftrkgdbadapter.cpp @@ -113,6 +113,7 @@ static inline QString startMsg(const trk::Session &session) TcfTrkGdbAdapter::TcfTrkGdbAdapter(GdbEngine *engine) : AbstractGdbAdapter(engine), m_running(false), + m_stopReason(0), m_trkDevice(new TcfTrkDevice(this)), m_gdbAckMode(true), m_uid(0), @@ -325,6 +326,9 @@ void TcfTrkGdbAdapter::tcftrkEvent(const TcfTrkEvent &e) m_snapshot.setThreadState(threadId, reason); // Update registers first, then report stopped m_running = false; + m_stopReason = reason.contains(QLatin1String("exception"), Qt::CaseInsensitive) + || reason.contains(QLatin1String("panic"), Qt::CaseInsensitive) ? + gdbServerSignalSegfault : gdbServerSignalTrap; m_trkDevice->sendRegistersGetMRangeCommand( TcfTrkCallback(this, &TcfTrkGdbAdapter::handleAndReportReadRegistersAfterStop), currentThreadContextId(), 0, @@ -688,7 +692,7 @@ void TcfTrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd) } else { //qDebug() << "Fetching single register"; m_trkDevice->sendRegistersGetMRangeCommand( - TcfTrkCallback(this, &TcfTrkGdbAdapter::handleAndReportReadRegistersAfterStop), + TcfTrkCallback(this, &TcfTrkGdbAdapter::handleAndReportReadRegister), currentThreadContextId(), registerNumber, 1); } } @@ -1304,7 +1308,7 @@ void TcfTrkGdbAdapter::handleAndReportReadRegistersAfterStop(const TcfTrkCommand handleReadRegisters(result); handleReadRegisters(result); const bool reportThread = m_session.tid != m_session.mainTid; - sendGdbServerMessage(m_snapshot.gdbStopMessage(m_session.tid, reportThread), stopMessage()); + sendGdbServerMessage(m_snapshot.gdbStopMessage(m_session.tid, m_stopReason, reportThread), stopMessage()); } void TcfTrkGdbAdapter::handleAndReportSetBreakpoint(const TcfTrkCommandResult &result) diff --git a/src/plugins/debugger/gdb/tcftrkgdbadapter.h b/src/plugins/debugger/gdb/tcftrkgdbadapter.h index ab69c13f256..71becf8e248 100644 --- a/src/plugins/debugger/gdb/tcftrkgdbadapter.h +++ b/src/plugins/debugger/gdb/tcftrkgdbadapter.h @@ -137,6 +137,7 @@ private: QString m_gdbServerName; // 127.0.0.1:(2222+uid) bool m_running; + int m_stopReason; tcftrk::TcfTrkDevice *m_trkDevice; QSharedPointer m_trkIODevice; diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp index 1961ab61cf4..1e32fcb26fd 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.cpp +++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp @@ -963,10 +963,12 @@ void TrkGdbAdapter::handleTrkResult(const TrkResult &result) # if 1 // We almost always need register values, so get them // now before informing gdb about the stop.s - //qDebug() << "Auto-fetching registers"; + const int signalNumber = reason.contains(QLatin1String("exception"), Qt::CaseInsensitive) + || reason.contains(QLatin1String("panic"), Qt::CaseInsensitive) ? + gdbServerSignalSegfault : gdbServerSignalTrap; sendTrkMessage(0x12, TrkCB(handleAndReportReadRegistersAfterStop), - Launcher::readRegistersMessage(m_session.pid, m_session.tid)); + Launcher::readRegistersMessage(m_session.pid, m_session.tid), signalNumber); # else // As a source-line step typically consists of // several instruction steps, better avoid the multiple @@ -1181,7 +1183,8 @@ void TrkGdbAdapter::handleAndReportReadRegistersAfterStop(const TrkResult &resul { handleReadRegisters(result); const bool reportThread = m_session.tid != m_session.mainTid; - sendGdbServerMessage(m_snapshot.gdbStopMessage(m_session.tid, reportThread), + const int signalNumber = result.cookie.isValid() ? result.cookie.toInt() : int(gdbServerSignalTrap); + sendGdbServerMessage(m_snapshot.gdbStopMessage(m_session.tid, signalNumber, reportThread), "Stopped with registers in thread " + QByteArray::number(m_session.tid, 16)); }