forked from qt-creator/qt-creator
new status widget for debugger output. needs a bit more polishing...
This commit is contained in:
@@ -62,6 +62,7 @@
|
||||
#include <QtCore/QDir>
|
||||
#include <QtCore/QFileInfo>
|
||||
#include <QtCore/QTime>
|
||||
#include <QtCore/QTimer>
|
||||
|
||||
#include <QtGui/QAction>
|
||||
#include <QtGui/QComboBox>
|
||||
@@ -145,6 +146,7 @@ void DebuggerManager::init()
|
||||
m_modulesHandler = 0;
|
||||
m_registerHandler = 0;
|
||||
|
||||
m_statusLabel = new QLabel;
|
||||
m_breakWindow = new BreakWindow;
|
||||
m_disassemblerWindow = new DisassemblerWindow;
|
||||
m_modulesWindow = new ModulesWindow;
|
||||
@@ -157,6 +159,7 @@ void DebuggerManager::init()
|
||||
//m_tooltipWindow = new WatchWindow(WatchWindow::TooltipType);
|
||||
//m_watchersWindow = new QTreeView;
|
||||
m_tooltipWindow = new QTreeView;
|
||||
m_statusTimer = new QTimer(this);
|
||||
|
||||
m_mainWindow = new QMainWindow;
|
||||
m_mainWindow->setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::North);
|
||||
@@ -408,6 +411,8 @@ void DebuggerManager::init()
|
||||
this, SLOT(saveSessionData()));
|
||||
connect(m_dumpLogAction, SIGNAL(triggered()),
|
||||
this, SLOT(dumpLog()));
|
||||
connect(m_statusTimer, SIGNAL(timeout()),
|
||||
this, SLOT(clearStatusMessage()));
|
||||
|
||||
connect(m_outputWindow, SIGNAL(commandExecutionRequested(QString)),
|
||||
this, SLOT(executeDebuggerCommand(QString)));
|
||||
@@ -553,24 +558,24 @@ QAbstractItemModel *DebuggerManager::threadsModel()
|
||||
return qobject_cast<ThreadsWindow*>(m_threadsWindow)->model();
|
||||
}
|
||||
|
||||
void DebuggerManager::clearStatusMessage()
|
||||
{
|
||||
m_statusLabel->setText(m_lastPermanentStatusMessage);
|
||||
}
|
||||
|
||||
void DebuggerManager::showStatusMessage(const QString &msg, int timeout)
|
||||
{
|
||||
Q_UNUSED(timeout)
|
||||
//qDebug() << "STATUS: " << msg;
|
||||
showDebuggerOutput("status:", msg);
|
||||
mainWindow()->statusBar()->showMessage(msg, timeout);
|
||||
#if 0
|
||||
QString currentTime = QTime::currentTime().toString("hh:mm:ss.zzz");
|
||||
|
||||
ICore *core = m_pm->getObject<Core::ICore>();
|
||||
//qDebug() << qPrintable(currentTime) << "Setting status: " << msg;
|
||||
if (msg.isEmpty())
|
||||
core->messageManager()->displayStatusBarMessage(msg);
|
||||
else if (timeout == -1)
|
||||
core->messageManager()->displayStatusBarMessage(tr("Debugger: ") + msg);
|
||||
else
|
||||
core->messageManager()->displayStatusBarMessage(tr("Debugger: ") + msg, timeout);
|
||||
#endif
|
||||
m_statusLabel->setText(" " + msg);
|
||||
if (timeout > 0) {
|
||||
m_statusTimer->setSingleShot(true);
|
||||
m_statusTimer->start(timeout);
|
||||
} else {
|
||||
m_lastPermanentStatusMessage = msg;
|
||||
m_statusTimer->stop();
|
||||
}
|
||||
}
|
||||
|
||||
void DebuggerManager::notifyStartupFinished()
|
||||
|
||||
@@ -44,9 +44,11 @@ QT_BEGIN_NAMESPACE
|
||||
class QAction;
|
||||
class QAbstractItemModel;
|
||||
class QDockWidget;
|
||||
class QLabel;
|
||||
class QMainWindow;
|
||||
class QModelIndex;
|
||||
class QSplitter;
|
||||
class QTimer;
|
||||
class QWidget;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
@@ -190,7 +192,8 @@ public:
|
||||
private:
|
||||
friend class DebugMode;
|
||||
|
||||
virtual QWidget *threadsWindow() = 0;
|
||||
virtual QWidget *threadsWindow() const = 0;
|
||||
virtual QLabel *statusLabel() const = 0;
|
||||
virtual QList<QDockWidget*> dockWidgets() const = 0;
|
||||
virtual void createDockWidgets() = 0;
|
||||
};
|
||||
@@ -213,6 +216,7 @@ public:
|
||||
IDebuggerManagerAccessForEngines *engineInterface();
|
||||
IDebuggerManagerAccessForDebugMode *debugModeInterface();
|
||||
QMainWindow *mainWindow() const { return m_mainWindow; }
|
||||
QLabel *statusLabel() const { return m_statusLabel; }
|
||||
|
||||
enum StartMode { startInternal, startExternal, attachExternal };
|
||||
enum DebuggerType { GdbDebugger, ScriptDebugger, WinDebugger };
|
||||
@@ -272,7 +276,7 @@ public slots:
|
||||
void assignValueInDebugger(const QString &expr, const QString &value);
|
||||
void executeDebuggerCommand(const QString &command);
|
||||
|
||||
void showStatusMessage(const QString &msg, int timeout); // -1 forever
|
||||
void showStatusMessage(const QString &msg, int timeout = -1); // -1 forever
|
||||
|
||||
private slots:
|
||||
void showDebuggerOutput(const QString &prefix, const QString &msg);
|
||||
@@ -290,6 +294,7 @@ private slots:
|
||||
void reloadRegisters();
|
||||
void registerDockToggled(bool on);
|
||||
void setStatus(int status);
|
||||
void clearStatusMessage();
|
||||
|
||||
private:
|
||||
//
|
||||
@@ -322,7 +327,7 @@ private:
|
||||
//
|
||||
// Implementation of IDebuggerManagerAccessForDebugMode
|
||||
//
|
||||
QWidget *threadsWindow() { return m_threadsWindow; }
|
||||
QWidget *threadsWindow() const { return m_threadsWindow; }
|
||||
QList<QDockWidget*> dockWidgets() const { return m_dockWidgets; }
|
||||
void createDockWidgets();
|
||||
|
||||
@@ -382,6 +387,7 @@ private:
|
||||
|
||||
/// Views
|
||||
QMainWindow *m_mainWindow;
|
||||
QLabel *m_statusLabel;
|
||||
QDockWidget *m_breakDock;
|
||||
QDockWidget *m_disassemblerDock;
|
||||
QDockWidget *m_modulesDock;
|
||||
@@ -440,6 +446,8 @@ private:
|
||||
|
||||
int m_status;
|
||||
bool m_busy;
|
||||
QTimer *m_statusTimer;
|
||||
QString m_lastPermanentStatusMessage;
|
||||
|
||||
IDebuggerEngine *engine();
|
||||
IDebuggerEngine *m_engine;
|
||||
|
||||
@@ -347,7 +347,7 @@ void GdbEngine::gdbProcError(QProcess::ProcessError error)
|
||||
"This is the default return value of error().");
|
||||
}
|
||||
|
||||
q->showStatusMessage(msg, 5000);
|
||||
q->showStatusMessage(msg);
|
||||
QMessageBox::critical(q->mainWindow(), tr("Error"), msg);
|
||||
// act as if it was closed by the core
|
||||
q->exitDebugger();
|
||||
@@ -710,7 +710,7 @@ void GdbEngine::sendCommand(const QString &command, int type,
|
||||
|
||||
bool temporarilyStopped = false;
|
||||
if (needStop && q->status() == DebuggerInferiorRunning) {
|
||||
q->showStatusMessage(tr("Temporarily stopped"), -1);
|
||||
q->showStatusMessage(tr("Temporarily stopped"));
|
||||
interruptInferior();
|
||||
temporarilyStopped = true;
|
||||
}
|
||||
@@ -1055,7 +1055,7 @@ void GdbEngine::handleExecJumpToLine(const GdbResultRecord &record)
|
||||
// ~"242\t x *= 2;"
|
||||
//109^done"
|
||||
qq->notifyInferiorStopped();
|
||||
q->showStatusMessage(tr("Jumped. Stopped."), -1);
|
||||
q->showStatusMessage(tr("Jumped. Stopped."));
|
||||
QString output = record.data.findChild("logstreamoutput").data();
|
||||
if (!output.isEmpty())
|
||||
return;
|
||||
@@ -1074,7 +1074,7 @@ void GdbEngine::handleExecRunToFunction(const GdbResultRecord &record)
|
||||
// func="foo",args=[{name="str",value="@0x7fff0f450460"}],
|
||||
// file="main.cpp",fullname="/tmp/g/main.cpp",line="37"}
|
||||
qq->notifyInferiorStopped();
|
||||
q->showStatusMessage(tr("Run to Function finished. Stopped."), -1);
|
||||
q->showStatusMessage(tr("Run to Function finished. Stopped."));
|
||||
GdbMi frame = record.data.findChild("frame");
|
||||
QString file = frame.findChild("fullname").data();
|
||||
int line = frame.findChild("line").data().toInt();
|
||||
@@ -1212,7 +1212,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
|
||||
}
|
||||
} else {
|
||||
// slow start requested.
|
||||
q->showStatusMessage("Loading " + data.toString(), -1);
|
||||
q->showStatusMessage(tr("Loading %1...").arg(QString(data.toString())));
|
||||
continueInferior();
|
||||
}
|
||||
return;
|
||||
@@ -1231,7 +1231,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
|
||||
msg = "Program exited after receiving signal "
|
||||
+ data.findChild("signal-name").toString();
|
||||
}
|
||||
q->showStatusMessage(msg, -1);
|
||||
q->showStatusMessage(msg);
|
||||
q->exitDebugger();
|
||||
return;
|
||||
}
|
||||
@@ -1271,7 +1271,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
|
||||
if (isStoppedReason(reason) || reason.isEmpty()) {
|
||||
// Need another round trip
|
||||
if (reason == "breakpoint-hit") {
|
||||
q->showStatusMessage(tr("Stopped at breakpoint."), -1);
|
||||
q->showStatusMessage(tr("Stopped at breakpoint"));
|
||||
GdbMi frame = data.findChild("frame");
|
||||
//qDebug() << frame.toString();
|
||||
m_currentFrame = frame.findChild("addr").data() + '%' +
|
||||
@@ -1283,7 +1283,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
|
||||
QVariant var = QVariant::fromValue<GdbMi>(data);
|
||||
sendCommand("p 0", GdbAsyncOutput2, var); // dummy
|
||||
} else {
|
||||
q->showStatusMessage(tr("Stopped. %1").arg(reason), -1);
|
||||
q->showStatusMessage(tr("Stopped. Reason: \"%1\"").arg(reason));
|
||||
handleAsyncOutput2(data);
|
||||
}
|
||||
return;
|
||||
@@ -1305,7 +1305,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
|
||||
// system="0.00136",start="1218810678.805432",end="1218810678.812011"}
|
||||
q->resetLocation();
|
||||
qq->notifyInferiorStopped();
|
||||
q->showStatusMessage(tr("Run to Function finished. Stopped."), -1);
|
||||
q->showStatusMessage(tr("Run to Function finished. Stopped."));
|
||||
GdbMi frame = data.findChild("frame");
|
||||
QString file = frame.findChild("fullname").data();
|
||||
int line = frame.findChild("line").data().toInt();
|
||||
@@ -1378,8 +1378,9 @@ void GdbEngine::handleShowVersion(const GdbResultRecord &response)
|
||||
if (response.resultClass == GdbResultDone) {
|
||||
m_gdbVersion = 100;
|
||||
QString msg = response.data.findChild("consolestreamoutput").data();
|
||||
QRegExp supported("GNU gdb 6.[6789]");
|
||||
if (msg.indexOf(supported) == -1) {
|
||||
QRegExp supported("GNU gdb(.*) (\\d+)\\.(\\d+)\\.(\\d+)");
|
||||
if (supported.indexIn(msg) == -1) {
|
||||
qDebug() << "UNSUPPORTED GDB VERSION " << msg;
|
||||
QStringList list = msg.split("\n");
|
||||
while (list.size() > 2)
|
||||
list.removeLast();
|
||||
@@ -1396,11 +1397,11 @@ void GdbEngine::handleShowVersion(const GdbResultRecord &response)
|
||||
#else
|
||||
//QMessageBox::information(m_mainWindow, tr("Warning"), msg);
|
||||
#endif
|
||||
}
|
||||
int pos = msg.indexOf("GNU gdb 6.");
|
||||
if (pos != -1) {
|
||||
m_gdbVersion = 600 + (msg.at(pos + 10).unicode() - '0') * 10;
|
||||
//qDebug() << "GDB VERSION " << m_gdbVersion << msg;
|
||||
} else {
|
||||
m_gdbVersion = 10000 * supported.cap(2).toInt()
|
||||
+ 100 * supported.cap(3).toInt()
|
||||
+ 1 * supported.cap(4).toInt();
|
||||
//qDebug() << "GDB VERSION " << m_gdbVersion;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1423,14 +1424,14 @@ void GdbEngine::handleExecRun(const GdbResultRecord &response)
|
||||
{
|
||||
if (response.resultClass == GdbResultRunning) {
|
||||
qq->notifyInferiorRunning();
|
||||
q->showStatusMessage(tr("Running..."), -1);
|
||||
q->showStatusMessage(tr("Running..."));
|
||||
//reloadModules();
|
||||
} else if (response.resultClass == GdbResultError) {
|
||||
QString msg = response.data.findChild("msg").data();
|
||||
if (msg == "Cannot find bounds of current function") {
|
||||
qq->notifyInferiorStopped();
|
||||
//q->showStatusMessage(tr("No debug information available. "
|
||||
// "Leaving function..."), -1);
|
||||
// "Leaving function..."));
|
||||
//stepOutExec();
|
||||
} else {
|
||||
QMessageBox::critical(q->mainWindow(), tr("Error"),
|
||||
@@ -1558,7 +1559,7 @@ bool GdbEngine::startDebugger()
|
||||
qDebug() << "ExeFile: " << q->m_executable;
|
||||
#endif
|
||||
|
||||
q->showStatusMessage("Starting Debugger", -1);
|
||||
q->showStatusMessage(tr("Starting Debugger"));
|
||||
emit gdbInputAvailable(QString(), theGdbSettings().m_gdbCmd + ' ' + gdbArgs.join(" "));
|
||||
|
||||
m_gdbProc.start(theGdbSettings().m_gdbCmd, gdbArgs);
|
||||
@@ -1567,7 +1568,7 @@ bool GdbEngine::startDebugger()
|
||||
if (m_gdbProc.state() != QProcess::Running)
|
||||
return false;
|
||||
|
||||
q->showStatusMessage(tr("Gdb Running"), -1);
|
||||
q->showStatusMessage(tr("Gdb Running"));
|
||||
|
||||
sendCommand("show version", GdbShowVersion);
|
||||
if (qq->useFastStart()) {
|
||||
@@ -2337,8 +2338,8 @@ void GdbEngine::handleModulesList(const GdbResultRecord &record)
|
||||
void GdbEngine::handleStackSelectThread(const GdbResultRecord &record, int)
|
||||
{
|
||||
Q_UNUSED(record);
|
||||
qDebug("FIXME: StackHandler::handleOutput: SelectThread");
|
||||
q->showStatusMessage(tr("Retrieving data for stack view..."), -1);
|
||||
//qDebug("FIXME: StackHandler::handleOutput: SelectThread");
|
||||
q->showStatusMessage(tr("Retrieving data for stack view..."), 3000);
|
||||
sendCommand("-stack-list-frames", StackListFrames);
|
||||
}
|
||||
|
||||
@@ -2432,7 +2433,7 @@ void GdbEngine::selectThread(int index)
|
||||
QList<ThreadData> threads = threadsHandler->threads();
|
||||
QWB_ASSERT(index < threads.size(), return);
|
||||
int id = threads.at(index).id;
|
||||
q->showStatusMessage(tr("Retrieving data for stack view..."), -1);
|
||||
q->showStatusMessage(tr("Retrieving data for stack view..."), 10000);
|
||||
sendCommand(QLatin1String("-thread-select ") + QString::number(id),
|
||||
StackSelectThread);
|
||||
}
|
||||
@@ -2545,7 +2546,7 @@ bool GdbEngine::supportsThreads() const
|
||||
{
|
||||
// 6.3 crashes happily on -thread-list-ids. So don't use it.
|
||||
// The test below is a semi-random pick, 6.8 works fine
|
||||
return m_gdbVersion > 650;
|
||||
return m_gdbVersion > 60500;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
@@ -3081,7 +3082,7 @@ void GdbEngine::runCustomDumper(const WatchData & data0, bool dumpChildren)
|
||||
|
||||
q->showStatusMessage(
|
||||
tr("Retrieving data for watch view (%1 requests pending)...")
|
||||
.arg(m_pendingRequests + 1), -1);
|
||||
.arg(m_pendingRequests + 1), 10000);
|
||||
// create response slot for socket data
|
||||
QVariant var;
|
||||
var.setValue(data);
|
||||
@@ -3299,7 +3300,7 @@ void GdbEngine::updateWatchModel2()
|
||||
PENDING_DEBUG("REBUILDING MODEL")
|
||||
emit gdbInputAvailable(QString(),
|
||||
"[" + currentTime() + "] <Rebuild Watchmodel>");
|
||||
q->showStatusMessage(tr("Finished retrieving data."), -1);
|
||||
q->showStatusMessage(tr("Finished retrieving data."), 400);
|
||||
qq->watchHandler()->rebuildModel();
|
||||
|
||||
if (!m_toolTipExpression.isEmpty()) {
|
||||
@@ -3313,9 +3314,6 @@ void GdbEngine::updateWatchModel2()
|
||||
"Cannot evaluate expression: " + m_toolTipExpression);
|
||||
}
|
||||
}
|
||||
|
||||
//qDebug() << "INSERT DATA" << data0.toString();
|
||||
//q->showStatusMessage(tr("Stopped."), 5000);
|
||||
}
|
||||
|
||||
void GdbEngine::handleQueryDataDumper1(const GdbResultRecord &record)
|
||||
@@ -3897,7 +3895,7 @@ void GdbEngine::handleToolTip(const GdbResultRecord &record,
|
||||
if (isCustomValueDumperAvailable(m_toolTip.type))
|
||||
runCustomDumper(m_toolTip, false);
|
||||
else
|
||||
q->showStatusMessage(tr("Retrieving data for tooltip..."), -1);
|
||||
q->showStatusMessage(tr("Retrieving data for tooltip..."), 10000);
|
||||
sendCommand("-data-evaluate-expression " + m_toolTip.exp,
|
||||
WatchToolTip, "evaluate");
|
||||
//sendToolTipCommand("-var-evaluate-expression tooltip")
|
||||
|
||||
@@ -169,6 +169,8 @@ QToolBar *DebugMode::createToolBar()
|
||||
managerAccess->threadsWindow(), SIGNAL(threadSelected(int)));
|
||||
debugToolBar->addWidget(threadBox);
|
||||
|
||||
debugToolBar->addWidget(managerAccess->statusLabel());
|
||||
|
||||
QWidget *stretch = new QWidget;
|
||||
stretch->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
|
||||
debugToolBar->addWidget(stretch);
|
||||
|
||||
Reference in New Issue
Block a user