forked from qt-creator/qt-creator
Debugger[TRK]: Report crashs with signals.
Show the message box correctly on signal 11 reported. Reviewed-by: hjk
This commit is contained in:
@@ -418,9 +418,9 @@ static void gdbAppendRegister(QByteArray *ba, uint regno, uint value)
|
|||||||
ba->append(';');
|
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) {
|
if (reportThreadId) {
|
||||||
ba += "thread:";
|
ba += "thread:";
|
||||||
ba += trk::hexNumber(threadId, 3);
|
ba += trk::hexNumber(threadId, 3);
|
||||||
|
|||||||
@@ -73,6 +73,12 @@ struct MemoryRange
|
|||||||
|
|
||||||
QDebug operator<<(QDebug d, const MemoryRange &range);
|
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 {
|
namespace Symbian {
|
||||||
|
|
||||||
enum CodeMode
|
enum CodeMode
|
||||||
@@ -135,7 +141,7 @@ struct Snapshot
|
|||||||
QByteArray gdbQsThreadInfo() const;
|
QByteArray gdbQsThreadInfo() const;
|
||||||
QByteArray gdbQThreadExtraInfo(const QByteArray &cmd) const;
|
QByteArray gdbQThreadExtraInfo(const QByteArray &cmd) const;
|
||||||
// Format a gdb T05 stop message with thread and register set
|
// 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
|
// Format a log message for memory access with some smartness about registers
|
||||||
QByteArray memoryReadLogMessage(uint addr, uint threadId, bool verbose, const QByteArray &ba) const;
|
QByteArray memoryReadLogMessage(uint addr, uint threadId, bool verbose, const QByteArray &ba) const;
|
||||||
// Gdb command parse helpers: 'salnext'
|
// Gdb command parse helpers: 'salnext'
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ static inline QString startMsg(const trk::Session &session)
|
|||||||
TcfTrkGdbAdapter::TcfTrkGdbAdapter(GdbEngine *engine) :
|
TcfTrkGdbAdapter::TcfTrkGdbAdapter(GdbEngine *engine) :
|
||||||
AbstractGdbAdapter(engine),
|
AbstractGdbAdapter(engine),
|
||||||
m_running(false),
|
m_running(false),
|
||||||
|
m_stopReason(0),
|
||||||
m_trkDevice(new TcfTrkDevice(this)),
|
m_trkDevice(new TcfTrkDevice(this)),
|
||||||
m_gdbAckMode(true),
|
m_gdbAckMode(true),
|
||||||
m_uid(0),
|
m_uid(0),
|
||||||
@@ -325,6 +326,9 @@ void TcfTrkGdbAdapter::tcftrkEvent(const TcfTrkEvent &e)
|
|||||||
m_snapshot.setThreadState(threadId, reason);
|
m_snapshot.setThreadState(threadId, reason);
|
||||||
// Update registers first, then report stopped
|
// Update registers first, then report stopped
|
||||||
m_running = false;
|
m_running = false;
|
||||||
|
m_stopReason = reason.contains(QLatin1String("exception"), Qt::CaseInsensitive)
|
||||||
|
|| reason.contains(QLatin1String("panic"), Qt::CaseInsensitive) ?
|
||||||
|
gdbServerSignalSegfault : gdbServerSignalTrap;
|
||||||
m_trkDevice->sendRegistersGetMRangeCommand(
|
m_trkDevice->sendRegistersGetMRangeCommand(
|
||||||
TcfTrkCallback(this, &TcfTrkGdbAdapter::handleAndReportReadRegistersAfterStop),
|
TcfTrkCallback(this, &TcfTrkGdbAdapter::handleAndReportReadRegistersAfterStop),
|
||||||
currentThreadContextId(), 0,
|
currentThreadContextId(), 0,
|
||||||
@@ -688,7 +692,7 @@ void TcfTrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd)
|
|||||||
} else {
|
} else {
|
||||||
//qDebug() << "Fetching single register";
|
//qDebug() << "Fetching single register";
|
||||||
m_trkDevice->sendRegistersGetMRangeCommand(
|
m_trkDevice->sendRegistersGetMRangeCommand(
|
||||||
TcfTrkCallback(this, &TcfTrkGdbAdapter::handleAndReportReadRegistersAfterStop),
|
TcfTrkCallback(this, &TcfTrkGdbAdapter::handleAndReportReadRegister),
|
||||||
currentThreadContextId(), registerNumber, 1);
|
currentThreadContextId(), registerNumber, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1304,7 +1308,7 @@ void TcfTrkGdbAdapter::handleAndReportReadRegistersAfterStop(const TcfTrkCommand
|
|||||||
handleReadRegisters(result);
|
handleReadRegisters(result);
|
||||||
handleReadRegisters(result);
|
handleReadRegisters(result);
|
||||||
const bool reportThread = m_session.tid != m_session.mainTid;
|
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)
|
void TcfTrkGdbAdapter::handleAndReportSetBreakpoint(const TcfTrkCommandResult &result)
|
||||||
|
|||||||
@@ -137,6 +137,7 @@ private:
|
|||||||
|
|
||||||
QString m_gdbServerName; // 127.0.0.1:(2222+uid)
|
QString m_gdbServerName; // 127.0.0.1:(2222+uid)
|
||||||
bool m_running;
|
bool m_running;
|
||||||
|
int m_stopReason;
|
||||||
tcftrk::TcfTrkDevice *m_trkDevice;
|
tcftrk::TcfTrkDevice *m_trkDevice;
|
||||||
QSharedPointer<QIODevice> m_trkIODevice;
|
QSharedPointer<QIODevice> m_trkIODevice;
|
||||||
|
|
||||||
|
|||||||
@@ -963,10 +963,12 @@ void TrkGdbAdapter::handleTrkResult(const TrkResult &result)
|
|||||||
# if 1
|
# if 1
|
||||||
// We almost always need register values, so get them
|
// We almost always need register values, so get them
|
||||||
// now before informing gdb about the stop.s
|
// 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,
|
sendTrkMessage(0x12,
|
||||||
TrkCB(handleAndReportReadRegistersAfterStop),
|
TrkCB(handleAndReportReadRegistersAfterStop),
|
||||||
Launcher::readRegistersMessage(m_session.pid, m_session.tid));
|
Launcher::readRegistersMessage(m_session.pid, m_session.tid), signalNumber);
|
||||||
# else
|
# else
|
||||||
// As a source-line step typically consists of
|
// As a source-line step typically consists of
|
||||||
// several instruction steps, better avoid the multiple
|
// several instruction steps, better avoid the multiple
|
||||||
@@ -1181,7 +1183,8 @@ void TrkGdbAdapter::handleAndReportReadRegistersAfterStop(const TrkResult &resul
|
|||||||
{
|
{
|
||||||
handleReadRegisters(result);
|
handleReadRegisters(result);
|
||||||
const bool reportThread = m_session.tid != m_session.mainTid;
|
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));
|
"Stopped with registers in thread " + QByteArray::number(m_session.tid, 16));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user