From 8888b8f532aa2b761c6f8f5428e6413e87296b6f Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Wed, 17 Nov 2010 17:16:34 +0100
Subject: [PATCH] Debugger: Introduce common messages to engine.

Try to achieve consistency in reporting stop messages for all
engines. Report by BreakpointId if available.
---
 src/plugins/debugger/debuggerengine.cpp | 66 +++++++++++++++++++++++++
 src/plugins/debugger/debuggerengine.h   | 11 +++++
 src/plugins/debugger/gdb/gdbengine.cpp  | 38 ++++++--------
 3 files changed, 93 insertions(+), 22 deletions(-)

diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 8bc54a88f0d..db9754b52cf 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -66,6 +66,7 @@
 #include <QtGui/QStandardItemModel>
 #include <QtGui/QAction>
 #include <QtGui/QTreeWidget>
+#include <QtGui/QMessageBox>
 
 using namespace Core;
 using namespace Debugger;
@@ -1366,6 +1367,71 @@ bool DebuggerEngine::isDying() const
     return targetState() == DebuggerFinished;
 }
 
+QString DebuggerEngine::msgWatchpointTriggered(BreakpointId id, const int number, quint64 address)
+{
+    return id != BreakpointId(-1) ?
+           tr("Watchpoint %1 (%2) at 0x%3 triggered.").arg(id).arg(number).arg(address, 0, 16) :
+           tr("Internal watchpoint %1 at 0x%2 triggered.").arg(number).arg(address, 0, 16);
+}
+
+QString DebuggerEngine::msgWatchpointTriggered(BreakpointId id, const int number,
+                                               quint64 address, const QString &threadId)
+{
+    return id != BreakpointId(-1) ?
+           tr("Watchpoint %1 (%2) at 0x%3 in thread %4 triggered.").
+               arg(id).arg(number).arg(address, 0, 16).arg(threadId) :
+           tr("Internal watchpoint %1 at 0x%2 in thread %3 triggered.").
+               arg(id).arg(number).arg(address, 0, 16).arg(threadId);
+}
+
+QString DebuggerEngine::msgBreakpointTriggered(BreakpointId id, const int number, const QString &threadId)
+{
+    return id != BreakpointId(-1) ?
+           tr("Stopped at breakpoint %1 (%2) in thread %3.").arg(id).arg(number).arg(threadId) :
+           tr("Stopped at internal breakpoint %1 in thread %2.").arg(number).arg(threadId);
+}
+
+QString DebuggerEngine::msgStopped(const QString &reason)
+{
+    return reason.isEmpty() ? tr("Stopped.") : tr("Stopped: \"%1\"").arg(reason);
+}
+
+QString DebuggerEngine::msgStoppedBySignal(const QString &meaning, const QString &name)
+{
+    return tr("Stopped: %1 by signal %2.").arg(meaning, name);
+}
+
+QString DebuggerEngine::msgStoppedByException(const QString &description, const QString &threadId)
+{
+    return tr("Stopped in thread %1 by: %2.").arg(threadId, description);
+}
+
+QString DebuggerEngine::msgInterrupted()
+{
+    return tr("Interrupted.");
+}
+
+void DebuggerEngine::showStoppedBySignalMessageBox(QString meaning, QString name)
+{
+    if (name.isEmpty())
+        name = tr(" <Unknown> ", "name");
+    if (meaning.isEmpty())
+        meaning = tr(" <Unknown> ", "meaning");
+    const QString msg = tr("<p>The inferior stopped because it received a "
+                           "signal from the Operating System.<p>"
+                           "<table><tr><td>Signal name : </td><td>%1</td></tr>"
+                           "<tr><td>Signal meaning : </td><td>%2</td></tr></table>")
+            .arg(name, meaning);
+    showMessageBox(QMessageBox::Information, tr("Signal received"), msg);
+}
+
+void DebuggerEngine::showStoppedByExceptionMessageBox(const QString &description)
+{
+    const QString msg = tr("<p>The inferior stopped because it triggered an exception.<p>%1").
+                         arg(description);
+    showMessageBox(QMessageBox::Information, tr("Exception Triggered"), msg);
+}
+
 } // namespace Debugger
 
 #include "debuggerengine.moc"
diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index 4ebf9f731a1..9d4e85e405e 100644
--- a/src/plugins/debugger/debuggerengine.h
+++ b/src/plugins/debugger/debuggerengine.h
@@ -336,6 +336,17 @@ protected:
 protected:
     DebuggerRunControl *runControl() const;
 
+    static QString msgWatchpointTriggered(BreakpointId id, int number, quint64 address);
+    static QString msgWatchpointTriggered(BreakpointId id, int number, quint64 address,
+                                          const QString &threadId);
+    static QString msgBreakpointTriggered(BreakpointId id, int number, const QString &threadId);
+    static QString msgStopped(const QString &reason = QString());
+    static QString msgStoppedBySignal(const QString &meaning, const QString &name);
+    static QString msgStoppedByException(const QString &description, const QString &threadId);
+    static QString msgInterrupted();
+    void showStoppedBySignalMessageBox(QString meaning, QString name);
+    void showStoppedByExceptionMessageBox(const QString &description);
+
 private:
     // wrapper engine needs access to state of its subengines
     friend class QmlCppEngine;
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 25935c654b2..04f02d6fb34 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -1372,18 +1372,20 @@ void GdbEngine::handleStop1(const GdbMi &data)
         // {name="p",value="0x0"}],file="x.h",fullname="/home/.../x.h",line="95"},
         // thread-id="1",stopped-threads="all",core="2"
         GdbMi wpt = data.findChild("wpt");
-        QByteArray bpNumber = wpt.findChild("number").data();
-        QByteArray bpAddress = wpt.findChild("exp").data();
-        //QByteArray threadId = data.findChild("thread-id").data();
-        showStatusMessage(tr("Watchpoint %1 at %2 triggered:")
-            .arg(_(bpNumber), _(bpAddress)));
-    } else if (reason == "breakpoint-hit") {
-        QByteArray bpNumber = data.findChild("bkptno").data();
-        QByteArray threadId = data.findChild("thread-id").data();
-        showStatusMessage(tr("Stopped at breakpoint %1 in thread %2")
-            .arg(_(bpNumber), _(threadId)));
+        const int bpNumber = wpt.findChild("number").data().toInt();
+        const BreakpointId id = breakHandler()->findBreakpointByNumber(bpNumber);
+        const quint64 bpAddress = wpt.findChild("exp").data().toULongLong(0, 0);
+        showStatusMessage(msgWatchpointTriggered(id, bpNumber, bpAddress));
+    } else if (reason == "breakpoint-hit") {        
+        GdbMi gNumber = data.findChild("bkptno"); // 'number' or 'bkptno'?
+        if (!gNumber.isValid())
+            gNumber = data.findChild("number");
+        const int bpNumber = gNumber.data().toInt();
+        const QByteArray threadId = data.findChild("thread-id").data();
+        const BreakpointId id = breakHandler()->findBreakpointByNumber(bpNumber);
+        showStatusMessage(msgBreakpointTriggered(id, bpNumber, QString::fromAscii(threadId)));
     } else {
-        QString reasontr = tr("Stopped: \"%1\"").arg(_(reason));
+        QString reasontr = msgStopped(_(reason));
         if (reason == "signal-received"
             && debuggerCore()->boolSetting(UseMessageBoxForSignals)) {
             QByteArray name = data.findChild("signal-name").data();
@@ -1393,22 +1395,14 @@ void GdbEngine::handleStop1(const GdbMi &data)
             if (name != STOP_SIGNAL
                 && (startParameters().startMode != AttachToRemote
                     || name != CROSS_STOP_SIGNAL)) {
-                QString msg = tr("<p>The inferior stopped because it received a "
-                    "signal from the Operating System.<p>"
-                    "<table><tr><td>Signal name : </td><td>%1</td></tr>"
-                    "<tr><td>Signal meaning : </td><td>%2</td></tr></table>")
-                    .arg(name.isEmpty() ? tr(" <Unknown> ", "name") : _(name))
-                    .arg(meaning.isEmpty() ? tr(" <Unknown> ", "meaning") : _(meaning));
-                showMessageBox(QMessageBox::Information,
-                    tr("Signal received"), msg);
+                showStoppedBySignalMessageBox(_(meaning), _(name));
                 if (!name.isEmpty() && !meaning.isEmpty())
-                    reasontr = tr("Stopped: %1 by signal %2")
-                        .arg(_(meaning)).arg(_(name));
+                    reasontr = msgStoppedBySignal(_(meaning), _(name));
             }
         }
 
         if (reason.isEmpty())
-            showStatusMessage(tr("Stopped."));
+            showStatusMessage(msgStopped());
         else
             showStatusMessage(reasontr);
     }
-- 
GitLab