2009-02-25 09:15:00 +01:00
|
|
|
/**************************************************************************
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
|
|
|
|
** This file is part of Qt Creator
|
|
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2009-06-17 00:01:27 +10:00
|
|
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Commercial Usage
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Licensees holding valid Qt Commercial licenses may use this file in
|
|
|
|
|
** accordance with the Qt Commercial License Agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
|
** a written agreement between you and Nokia.
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** GNU Lesser General Public License Usage
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
|
|
|
** General Public License version 2.1 as published by the Free Software
|
|
|
|
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
|
|
|
** packaging of this file. Please review the following information to
|
|
|
|
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
|
|
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** If you are unsure which license is appropriate for your use, please
|
2009-08-14 09:30:56 +02:00
|
|
|
** contact the sales department at http://qt.nokia.com/contact.
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
**************************************************************************/
|
2008-12-02 15:08:31 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "debuggerplugin.h"
|
|
|
|
|
|
2009-04-28 15:08:52 +02:00
|
|
|
#include "breakhandler.h"
|
2009-03-17 17:00:06 +01:00
|
|
|
#include "debuggeractions.h"
|
2009-05-25 16:22:11 +02:00
|
|
|
#include "debuggerdialogs.h"
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "debuggerconstants.h"
|
|
|
|
|
#include "debuggermanager.h"
|
|
|
|
|
#include "debuggerrunner.h"
|
2009-09-25 15:02:16 +02:00
|
|
|
#include "debuggerstringutils.h"
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-04-17 09:03:32 +02:00
|
|
|
#include "ui_commonoptionspage.h"
|
2009-03-23 12:28:02 +01:00
|
|
|
#include "ui_dumperoptionpage.h"
|
2009-01-14 18:09:02 +01:00
|
|
|
|
2009-01-13 13:39:31 +01:00
|
|
|
#include <coreplugin/actionmanager/actionmanager.h>
|
2009-01-13 18:15:24 +01:00
|
|
|
#include <coreplugin/basemode.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <coreplugin/coreconstants.h>
|
2009-01-14 18:09:02 +01:00
|
|
|
#include <coreplugin/dialogs/ioptionspage.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <coreplugin/editormanager/editormanager.h>
|
2009-01-13 18:15:24 +01:00
|
|
|
#include <coreplugin/findplaceholder.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <coreplugin/icore.h>
|
2009-10-26 18:05:11 +01:00
|
|
|
#include <coreplugin/icorelistener.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <coreplugin/messagemanager.h>
|
2009-01-13 18:15:24 +01:00
|
|
|
#include <coreplugin/minisplitter.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <coreplugin/modemanager.h>
|
2009-01-13 18:15:24 +01:00
|
|
|
#include <coreplugin/navigationwidget.h>
|
|
|
|
|
#include <coreplugin/outputpane.h>
|
|
|
|
|
#include <coreplugin/rightpane.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <coreplugin/uniqueidmanager.h>
|
2008-12-09 16:18:28 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <cplusplus/ExpressionUnderCursor.h>
|
2008-12-09 16:18:28 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <cppeditor/cppeditorconstants.h>
|
2008-12-09 16:18:28 +01:00
|
|
|
|
2009-01-20 11:52:04 +01:00
|
|
|
#include <extensionsystem/pluginmanager.h>
|
|
|
|
|
|
2009-01-28 14:29:54 +01:00
|
|
|
#include <projectexplorer/projectexplorer.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <projectexplorer/projectexplorerconstants.h>
|
|
|
|
|
#include <projectexplorer/session.h>
|
2009-09-29 11:39:55 +02:00
|
|
|
#include <projectexplorer/project.h>
|
2008-12-09 16:18:28 +01:00
|
|
|
|
|
|
|
|
#include <texteditor/basetexteditor.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <texteditor/basetextmark.h>
|
|
|
|
|
#include <texteditor/itexteditor.h>
|
|
|
|
|
#include <texteditor/texteditorconstants.h>
|
2008-12-09 16:18:28 +01:00
|
|
|
|
|
|
|
|
#include <utils/qtcassert.h>
|
2009-07-16 15:57:59 +02:00
|
|
|
#include <utils/styledbar.h>
|
2009-08-06 16:01:51 +02:00
|
|
|
#include <utils/fancymainwindow.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
#include <QtCore/QDebug>
|
|
|
|
|
#include <QtCore/QObject>
|
|
|
|
|
#include <QtCore/QPoint>
|
|
|
|
|
#include <QtCore/QSettings>
|
2009-01-05 12:54:52 +01:00
|
|
|
#include <QtCore/QtPlugin>
|
2009-04-17 09:03:32 +02:00
|
|
|
#include <QtCore/QCoreApplication>
|
2009-05-25 16:22:11 +02:00
|
|
|
#include <QtCore/QTimer>
|
2008-12-09 16:18:28 +01:00
|
|
|
|
2009-01-14 18:09:02 +01:00
|
|
|
#include <QtGui/QLineEdit>
|
2009-01-13 17:41:23 +01:00
|
|
|
#include <QtGui/QDockWidget>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <QtGui/QPlainTextEdit>
|
|
|
|
|
#include <QtGui/QTextBlock>
|
|
|
|
|
#include <QtGui/QTextCursor>
|
2009-10-01 16:38:08 +02:00
|
|
|
#include <QtGui/QToolButton>
|
2009-05-25 16:22:11 +02:00
|
|
|
#include <QtGui/QMessageBox>
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-08-12 10:51:25 +02:00
|
|
|
#include <climits>
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
using namespace Core;
|
2009-01-13 18:15:24 +01:00
|
|
|
using namespace Debugger::Constants;
|
|
|
|
|
using namespace Debugger::Internal;
|
2008-12-02 12:01:29 +01:00
|
|
|
using namespace ProjectExplorer;
|
2009-01-13 18:15:24 +01:00
|
|
|
using namespace TextEditor;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace Debugger {
|
|
|
|
|
namespace Constants {
|
|
|
|
|
|
2009-06-08 19:28:28 +02:00
|
|
|
const char * const M_DEBUG_START_DEBUGGING = "QtCreator.Menu.Debug.StartDebugging";
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
const char * const STARTEXTERNAL = "Debugger.StartExternal";
|
|
|
|
|
const char * const ATTACHEXTERNAL = "Debugger.AttachExternal";
|
2009-03-02 15:14:12 +01:00
|
|
|
const char * const ATTACHCORE = "Debugger.AttachCore";
|
2009-05-04 14:47:45 +02:00
|
|
|
const char * const ATTACHREMOTE = "Debugger.AttachRemote";
|
2009-05-07 15:20:44 +02:00
|
|
|
const char * const DETACH = "Debugger.Detach";
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
const char * const RUN_TO_LINE = "Debugger.RunToLine";
|
|
|
|
|
const char * const RUN_TO_FUNCTION = "Debugger.RunToFunction";
|
|
|
|
|
const char * const JUMP_TO_LINE = "Debugger.JumpToLine";
|
|
|
|
|
const char * const TOGGLE_BREAK = "Debugger.ToggleBreak";
|
|
|
|
|
const char * const BREAK_BY_FUNCTION = "Debugger.BreakByFunction";
|
|
|
|
|
const char * const BREAK_AT_MAIN = "Debugger.BreakAtMain";
|
|
|
|
|
const char * const ADD_TO_WATCH = "Debugger.AddToWatch";
|
2009-09-29 11:13:19 +02:00
|
|
|
const char * const OPERATE_BY_INSTRUCTION = "Debugger.OperateByInstruction";
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-06-03 20:45:49 +02:00
|
|
|
#ifdef Q_WS_MAC
|
2008-12-02 12:01:29 +01:00
|
|
|
const char * const INTERRUPT_KEY = "Shift+F5";
|
|
|
|
|
const char * const RESET_KEY = "Ctrl+Shift+F5";
|
|
|
|
|
const char * const STEP_KEY = "F7";
|
|
|
|
|
const char * const STEPOUT_KEY = "Shift+F7";
|
|
|
|
|
const char * const NEXT_KEY = "F6";
|
2009-05-25 17:19:42 +02:00
|
|
|
const char * const REVERSE_KEY = "";
|
2008-12-02 12:01:29 +01:00
|
|
|
const char * const RUN_TO_LINE_KEY = "Shift+F8";
|
|
|
|
|
const char * const RUN_TO_FUNCTION_KEY = "Ctrl+F6";
|
|
|
|
|
const char * const JUMP_TO_LINE_KEY = "Alt+D,Alt+L";
|
|
|
|
|
const char * const TOGGLE_BREAK_KEY = "F8";
|
|
|
|
|
const char * const BREAK_BY_FUNCTION_KEY = "Alt+D,Alt+F";
|
|
|
|
|
const char * const BREAK_AT_MAIN_KEY = "Alt+D,Alt+M";
|
|
|
|
|
const char * const ADD_TO_WATCH_KEY = "Alt+D,Alt+W";
|
|
|
|
|
#else
|
|
|
|
|
const char * const INTERRUPT_KEY = "Shift+F5";
|
|
|
|
|
const char * const RESET_KEY = "Ctrl+Shift+F5";
|
|
|
|
|
const char * const STEP_KEY = "F11";
|
|
|
|
|
const char * const STEPOUT_KEY = "Shift+F11";
|
|
|
|
|
const char * const NEXT_KEY = "F10";
|
2009-05-25 17:19:42 +02:00
|
|
|
const char * const REVERSE_KEY = "F12";
|
2008-12-02 12:01:29 +01:00
|
|
|
const char * const RUN_TO_LINE_KEY = "";
|
|
|
|
|
const char * const RUN_TO_FUNCTION_KEY = "";
|
|
|
|
|
const char * const JUMP_TO_LINE_KEY = "";
|
|
|
|
|
const char * const TOGGLE_BREAK_KEY = "F9";
|
|
|
|
|
const char * const BREAK_BY_FUNCTION_KEY = "";
|
|
|
|
|
const char * const BREAK_AT_MAIN_KEY = "";
|
|
|
|
|
const char * const ADD_TO_WATCH_KEY = "Ctrl+Alt+Q";
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
} // namespace Constants
|
|
|
|
|
} // namespace Debugger
|
|
|
|
|
|
|
|
|
|
|
2009-01-28 14:29:54 +01:00
|
|
|
static ProjectExplorer::SessionManager *sessionManager()
|
|
|
|
|
{
|
|
|
|
|
return ProjectExplorer::ProjectExplorerPlugin::instance()->session();
|
|
|
|
|
}
|
|
|
|
|
|
2009-04-28 15:08:52 +02:00
|
|
|
static QSettings *settings()
|
|
|
|
|
{
|
|
|
|
|
return ICore::instance()->settings();
|
|
|
|
|
}
|
|
|
|
|
|
2009-07-16 15:57:59 +02:00
|
|
|
static QToolButton *toolButton(QAction *action)
|
|
|
|
|
{
|
|
|
|
|
QToolButton *button = new QToolButton;
|
|
|
|
|
button->setDefaultAction(action);
|
|
|
|
|
return button;
|
|
|
|
|
}
|
|
|
|
|
|
2009-01-14 18:09:02 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// DebugMode
|
|
|
|
|
//
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
namespace Debugger {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
|
|
|
|
class DebugMode : public Core::BaseMode
|
|
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
DebugMode(QObject *parent = 0);
|
|
|
|
|
~DebugMode();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
DebugMode::DebugMode(QObject *parent)
|
2009-01-14 12:00:22 +01:00
|
|
|
: BaseMode(parent)
|
2009-01-13 18:15:24 +01:00
|
|
|
{
|
2009-01-14 12:00:22 +01:00
|
|
|
setName(tr("Debug"));
|
|
|
|
|
setUniqueModeName(Constants::MODE_DEBUG);
|
|
|
|
|
setIcon(QIcon(":/fancyactionbar/images/mode_Debug.png"));
|
|
|
|
|
setPriority(Constants::P_MODE_DEBUG);
|
2009-01-13 18:15:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DebugMode::~DebugMode()
|
|
|
|
|
{
|
|
|
|
|
// Make sure the editor manager does not get deleted
|
|
|
|
|
EditorManager::instance()->setParent(0);
|
|
|
|
|
}
|
|
|
|
|
|
2009-10-26 18:05:11 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// DebuggerListener: Close the debugging session if running.
|
|
|
|
|
//
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
class DebuggerListener : public Core::ICoreListener {
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
public:
|
|
|
|
|
explicit DebuggerListener(QObject *parent = 0);
|
|
|
|
|
virtual bool coreAboutToClose();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
DebuggerListener::DebuggerListener(QObject *parent) :
|
|
|
|
|
Core::ICoreListener(parent)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DebuggerListener::coreAboutToClose()
|
|
|
|
|
{
|
|
|
|
|
DebuggerManager *mgr = DebuggerManager::instance();
|
|
|
|
|
if (!mgr)
|
|
|
|
|
return true;
|
|
|
|
|
// Ask to terminate the session.
|
|
|
|
|
const QString title = tr("Close Debugging Session");
|
|
|
|
|
bool cleanTermination = false;
|
|
|
|
|
switch (mgr->state()) {
|
|
|
|
|
case DebuggerNotReady:
|
|
|
|
|
return true;
|
|
|
|
|
case AdapterStarted: // Most importantly, terminating a running
|
|
|
|
|
case AdapterStartFailed: // debuggee can cause problems.
|
|
|
|
|
case InferiorUnrunnable:
|
|
|
|
|
case InferiorStartFailed:
|
|
|
|
|
case InferiorStopped:
|
|
|
|
|
case InferiorShutDown:
|
|
|
|
|
cleanTermination = true;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
const QString question = cleanTermination ?
|
|
|
|
|
tr("A debugging session is still in progress. Would you like to terminate it?") :
|
|
|
|
|
tr("A debugging session is still in progress. Terminating the session in the current"
|
|
|
|
|
" state (%1) can leave the target in an inconsistent state."
|
2009-10-27 19:34:40 +01:00
|
|
|
" Would you still like to terminate it?")
|
2009-10-26 18:05:11 +01:00
|
|
|
.arg(QLatin1String(DebuggerManager::stateName(mgr->state())));
|
2009-10-27 19:34:40 +01:00
|
|
|
QMessageBox::StandardButton answer = QMessageBox::question(mgr->mainWindow(), title, question,
|
|
|
|
|
QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);
|
|
|
|
|
if (answer != QMessageBox::Yes)
|
2009-10-26 18:05:11 +01:00
|
|
|
return false;
|
|
|
|
|
mgr->exitDebugger();
|
2009-10-27 09:51:14 +01:00
|
|
|
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
|
2009-10-26 18:05:11 +01:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2009-01-14 18:09:02 +01:00
|
|
|
} // namespace Internal
|
|
|
|
|
} // namespace Debugger
|
|
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// LocationMark
|
|
|
|
|
//
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2009-01-14 18:09:02 +01:00
|
|
|
namespace Debugger {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
2009-08-14 13:04:05 +02:00
|
|
|
static QIcon locationMarkIcon()
|
|
|
|
|
{
|
|
|
|
|
static const QIcon icon(":/debugger/images/location.svg");
|
|
|
|
|
return icon;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Used in "real" editors
|
2009-01-14 18:09:02 +01:00
|
|
|
class LocationMark : public TextEditor::BaseTextMark
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
LocationMark(const QString &fileName, int linenumber)
|
|
|
|
|
: BaseTextMark(fileName, linenumber)
|
2008-12-12 17:49:52 +01:00
|
|
|
{}
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-08-14 13:04:05 +02:00
|
|
|
QIcon icon() const { return locationMarkIcon(); }
|
2008-12-02 12:01:29 +01:00
|
|
|
void updateLineNumber(int /*lineNumber*/) {}
|
|
|
|
|
void updateBlock(const QTextBlock & /*block*/) {}
|
2008-12-12 17:49:52 +01:00
|
|
|
void removedFromEditor() {}
|
2008-12-02 12:01:29 +01:00
|
|
|
};
|
|
|
|
|
|
2009-01-14 18:09:02 +01:00
|
|
|
} // namespace Internal
|
|
|
|
|
} // namespace Debugger
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
2009-04-17 09:03:32 +02:00
|
|
|
// CommonOptionsPage
|
2009-01-14 18:09:02 +01:00
|
|
|
//
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
namespace Debugger {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
2009-04-17 09:03:32 +02:00
|
|
|
class CommonOptionsPage : public Core::IOptionsPage
|
2009-01-14 18:09:02 +01:00
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
public:
|
2009-04-17 09:03:32 +02:00
|
|
|
CommonOptionsPage() {}
|
2009-01-14 18:09:02 +01:00
|
|
|
|
|
|
|
|
// IOptionsPage
|
2009-04-28 15:08:52 +02:00
|
|
|
QString id() const
|
|
|
|
|
{ return QLatin1String(Debugger::Constants::DEBUGGER_COMMON_SETTINGS_PAGE); }
|
|
|
|
|
QString trName() const
|
|
|
|
|
{ return QCoreApplication::translate("Debugger", Debugger::Constants::DEBUGGER_COMMON_SETTINGS_PAGE); }
|
|
|
|
|
QString category() const
|
|
|
|
|
{ return QLatin1String(Debugger::Constants::DEBUGGER_SETTINGS_CATEGORY); }
|
|
|
|
|
QString trCategory() const
|
|
|
|
|
{ return QCoreApplication::translate("Debugger", Debugger::Constants::DEBUGGER_SETTINGS_CATEGORY); }
|
2009-01-14 18:09:02 +01:00
|
|
|
|
|
|
|
|
QWidget *createPage(QWidget *parent);
|
2009-04-28 15:08:52 +02:00
|
|
|
void apply() { m_group.apply(settings()); }
|
2009-03-26 15:56:16 +01:00
|
|
|
void finish() { m_group.finish(); }
|
2009-01-14 18:09:02 +01:00
|
|
|
|
|
|
|
|
private:
|
2009-04-17 09:03:32 +02:00
|
|
|
Ui::CommonOptionsPage m_ui;
|
2009-10-05 11:06:05 +02:00
|
|
|
Utils::SavedActionSet m_group;
|
2009-01-14 18:09:02 +01:00
|
|
|
};
|
|
|
|
|
|
2009-04-17 09:03:32 +02:00
|
|
|
QWidget *CommonOptionsPage::createPage(QWidget *parent)
|
2009-01-14 18:09:02 +01:00
|
|
|
{
|
|
|
|
|
QWidget *w = new QWidget(parent);
|
|
|
|
|
m_ui.setupUi(w);
|
2009-03-26 17:27:44 +01:00
|
|
|
m_group.clear();
|
2009-03-26 15:56:16 +01:00
|
|
|
|
2009-05-25 16:22:11 +02:00
|
|
|
m_group.insert(theDebuggerAction(ListSourceFiles),
|
2009-03-26 17:27:44 +01:00
|
|
|
m_ui.checkBoxListSourceFiles);
|
2009-05-25 16:22:11 +02:00
|
|
|
m_group.insert(theDebuggerAction(UseAlternatingRowColors),
|
2009-05-05 10:14:35 +02:00
|
|
|
m_ui.checkBoxUseAlternatingRowColors);
|
2009-08-13 14:33:02 +02:00
|
|
|
m_group.insert(theDebuggerAction(UseMessageBoxForSignals),
|
|
|
|
|
m_ui.checkBoxUseMessageBoxForSignals);
|
2009-05-25 16:22:11 +02:00
|
|
|
m_group.insert(theDebuggerAction(SkipKnownFrames),
|
2009-03-26 15:56:16 +01:00
|
|
|
m_ui.checkBoxSkipKnownFrames);
|
2009-10-01 18:01:23 +02:00
|
|
|
m_group.insert(theDebuggerAction(UseToolTipsInMainEditor),
|
|
|
|
|
m_ui.checkBoxUseToolTipsInMainEditor);
|
2009-10-06 10:54:08 +02:00
|
|
|
m_group.insert(theDebuggerAction(AutoDerefPointers), 0);
|
2009-10-01 11:22:44 +02:00
|
|
|
m_group.insert(theDebuggerAction(UseToolTipsInLocalsView), 0);
|
|
|
|
|
m_group.insert(theDebuggerAction(UseToolTipsInBreakpointsView), 0);
|
|
|
|
|
m_group.insert(theDebuggerAction(UseAddressInBreakpointsView), 0);
|
|
|
|
|
m_group.insert(theDebuggerAction(UseAddressInStackView), 0);
|
2009-05-25 17:19:42 +02:00
|
|
|
m_group.insert(theDebuggerAction(EnableReverseDebugging),
|
|
|
|
|
m_ui.checkBoxEnableReverseDebugging);
|
|
|
|
|
m_group.insert(theDebuggerAction(MaximalStackDepth),
|
2009-04-02 15:06:24 +02:00
|
|
|
m_ui.spinBoxMaximalStackDepth);
|
2009-01-14 18:09:02 +01:00
|
|
|
|
2009-06-04 16:15:01 +02:00
|
|
|
#ifdef USE_REVERSE_DEBUGGING
|
|
|
|
|
m_ui.checkBoxEnableReverseDebugging->hide();
|
|
|
|
|
#endif
|
|
|
|
|
|
2009-01-14 18:09:02 +01:00
|
|
|
return w;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Internal
|
|
|
|
|
} // namespace Debugger
|
|
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
|
2009-03-23 12:28:02 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
2009-04-07 16:39:17 +02:00
|
|
|
// DebuggingHelperOptionPage
|
2009-03-23 12:28:02 +01:00
|
|
|
//
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
namespace Debugger {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
2009-04-07 16:39:17 +02:00
|
|
|
class DebuggingHelperOptionPage : public Core::IOptionsPage
|
2009-03-23 12:28:02 +01:00
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
public:
|
2009-04-07 16:39:17 +02:00
|
|
|
DebuggingHelperOptionPage() {}
|
2009-03-23 12:28:02 +01:00
|
|
|
|
|
|
|
|
// IOptionsPage
|
2009-04-07 16:39:17 +02:00
|
|
|
QString id() const { return QLatin1String("DebuggingHelper"); }
|
|
|
|
|
QString trName() const { return tr("Debugging Helper"); }
|
2009-04-17 09:03:32 +02:00
|
|
|
QString category() const { return QLatin1String(Debugger::Constants::DEBUGGER_SETTINGS_CATEGORY); }
|
|
|
|
|
QString trCategory() const { return QCoreApplication::translate("Debugger", Debugger::Constants::DEBUGGER_SETTINGS_CATEGORY); }
|
2009-03-23 12:28:02 +01:00
|
|
|
|
|
|
|
|
QWidget *createPage(QWidget *parent);
|
2009-04-28 15:08:52 +02:00
|
|
|
void apply() { m_group.apply(settings()); }
|
2009-03-26 15:56:16 +01:00
|
|
|
void finish() { m_group.finish(); }
|
2009-03-23 12:28:02 +01:00
|
|
|
|
|
|
|
|
private:
|
2009-03-27 13:04:23 +01:00
|
|
|
Q_SLOT void updateState();
|
|
|
|
|
|
2009-03-23 12:28:02 +01:00
|
|
|
friend class DebuggerPlugin;
|
2009-04-07 16:39:17 +02:00
|
|
|
Ui::DebuggingHelperOptionPage m_ui;
|
2009-03-23 12:28:02 +01:00
|
|
|
|
2009-10-05 11:06:05 +02:00
|
|
|
Utils::SavedActionSet m_group;
|
2009-03-23 12:28:02 +01:00
|
|
|
};
|
|
|
|
|
|
2009-04-07 16:39:17 +02:00
|
|
|
QWidget *DebuggingHelperOptionPage::createPage(QWidget *parent)
|
2009-03-23 12:28:02 +01:00
|
|
|
{
|
|
|
|
|
QWidget *w = new QWidget(parent);
|
|
|
|
|
m_ui.setupUi(w);
|
|
|
|
|
|
2009-10-05 11:06:05 +02:00
|
|
|
m_ui.dumperLocationChooser->setExpectedKind(Utils::PathChooser::Command);
|
2009-04-07 16:39:17 +02:00
|
|
|
m_ui.dumperLocationChooser->setPromptDialogTitle(tr("Choose DebuggingHelper Location"));
|
2009-03-23 13:02:50 +01:00
|
|
|
m_ui.dumperLocationChooser->setInitialBrowsePathBackup(
|
|
|
|
|
Core::ICore::instance()->resourcePath() + "../../lib");
|
2009-03-23 12:28:02 +01:00
|
|
|
|
2009-04-07 16:39:17 +02:00
|
|
|
connect(m_ui.checkBoxUseDebuggingHelpers, SIGNAL(toggled(bool)),
|
2009-03-27 13:04:23 +01:00
|
|
|
this, SLOT(updateState()));
|
2009-04-07 16:39:17 +02:00
|
|
|
connect(m_ui.checkBoxUseCustomDebuggingHelperLocation, SIGNAL(toggled(bool)),
|
2009-03-27 13:04:23 +01:00
|
|
|
this, SLOT(updateState()));
|
2009-03-23 14:34:01 +01:00
|
|
|
|
2009-03-26 17:27:44 +01:00
|
|
|
m_group.clear();
|
2009-04-07 16:39:17 +02:00
|
|
|
m_group.insert(theDebuggerAction(UseDebuggingHelpers),
|
|
|
|
|
m_ui.checkBoxUseDebuggingHelpers);
|
|
|
|
|
m_group.insert(theDebuggerAction(UseCustomDebuggingHelperLocation),
|
|
|
|
|
m_ui.checkBoxUseCustomDebuggingHelperLocation);
|
|
|
|
|
m_group.insert(theDebuggerAction(CustomDebuggingHelperLocation),
|
2009-03-26 15:56:16 +01:00
|
|
|
m_ui.dumperLocationChooser);
|
2009-03-23 12:28:02 +01:00
|
|
|
|
2009-10-16 16:26:28 +02:00
|
|
|
m_group.insert(theDebuggerAction(UseCodeModel),
|
|
|
|
|
m_ui.checkBoxUseCodeModel);
|
|
|
|
|
|
2009-07-10 14:38:36 +02:00
|
|
|
#ifdef QT_DEBUG
|
2009-04-07 16:39:17 +02:00
|
|
|
m_group.insert(theDebuggerAction(DebugDebuggingHelpers),
|
|
|
|
|
m_ui.checkBoxDebugDebuggingHelpers);
|
2009-07-10 14:38:36 +02:00
|
|
|
#else
|
|
|
|
|
m_ui.checkBoxDebugDebuggingHelpers->hide();
|
|
|
|
|
#endif
|
2009-03-23 12:28:02 +01:00
|
|
|
|
|
|
|
|
m_ui.dumperLocationChooser->
|
2009-04-07 16:39:17 +02:00
|
|
|
setEnabled(theDebuggerAction(UseCustomDebuggingHelperLocation)->value().toBool());
|
2009-03-23 12:28:02 +01:00
|
|
|
|
|
|
|
|
#ifndef QT_DEBUG
|
|
|
|
|
#if 0
|
|
|
|
|
cmd = am->registerAction(m_manager->m_dumpLogAction,
|
|
|
|
|
Constants::DUMP_LOG, globalcontext);
|
|
|
|
|
//cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+D,Ctrl+L")));
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+F11")));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
2009-05-06 09:17:16 +02:00
|
|
|
updateState();
|
2009-03-23 12:28:02 +01:00
|
|
|
|
|
|
|
|
return w;
|
|
|
|
|
}
|
|
|
|
|
|
2009-04-07 16:39:17 +02:00
|
|
|
void DebuggingHelperOptionPage::updateState()
|
2009-03-27 13:04:23 +01:00
|
|
|
{
|
2009-04-07 16:39:17 +02:00
|
|
|
m_ui.checkBoxUseCustomDebuggingHelperLocation->setEnabled(
|
|
|
|
|
m_ui.checkBoxUseDebuggingHelpers->isChecked());
|
2009-05-06 09:17:16 +02:00
|
|
|
bool locationEnabled = m_ui.checkBoxUseDebuggingHelpers->isChecked()
|
|
|
|
|
&& m_ui.checkBoxUseCustomDebuggingHelperLocation->isChecked();
|
|
|
|
|
m_ui.dumperLocationChooser->setEnabled(locationEnabled);
|
|
|
|
|
m_ui.dumperLocationLabel->setEnabled(locationEnabled);
|
2009-03-27 13:04:23 +01:00
|
|
|
}
|
|
|
|
|
|
2009-03-23 12:28:02 +01:00
|
|
|
} // namespace Internal
|
|
|
|
|
} // namespace Debugger
|
|
|
|
|
|
2009-08-12 10:51:25 +02:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// DebuggerPlugin
|
|
|
|
|
//
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2009-04-28 15:08:52 +02:00
|
|
|
DebuggerPlugin::DebuggerPlugin()
|
|
|
|
|
: m_manager(0),
|
2009-04-17 09:03:32 +02:00
|
|
|
m_debugMode(0),
|
|
|
|
|
m_locationMark(0),
|
|
|
|
|
m_gdbRunningContext(0),
|
2009-05-25 16:22:11 +02:00
|
|
|
m_cmdLineEnabledEngines(AllEngineTypes),
|
|
|
|
|
m_cmdLineAttachPid(0),
|
2009-05-26 16:27:24 +02:00
|
|
|
m_cmdLineWinCrashEvent(0),
|
2009-04-28 15:08:52 +02:00
|
|
|
m_toggleLockedAction(0)
|
|
|
|
|
{}
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
DebuggerPlugin::~DebuggerPlugin()
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::shutdown()
|
|
|
|
|
{
|
2008-12-09 12:08:56 +01:00
|
|
|
QTC_ASSERT(m_manager, /**/);
|
2008-12-02 12:01:29 +01:00
|
|
|
if (m_manager)
|
|
|
|
|
m_manager->shutdown();
|
|
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
writeSettings();
|
2009-06-03 13:53:45 +02:00
|
|
|
delete DebuggerSettings::instance();
|
2009-01-13 18:15:24 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
//qDebug() << "DebuggerPlugin::~DebuggerPlugin";
|
|
|
|
|
removeObject(m_debugMode);
|
|
|
|
|
|
|
|
|
|
// FIXME: when using the line below, BreakWindow etc gets deleted twice.
|
|
|
|
|
// so better leak for now...
|
|
|
|
|
delete m_debugMode;
|
|
|
|
|
m_debugMode = 0;
|
|
|
|
|
|
|
|
|
|
delete m_locationMark;
|
|
|
|
|
m_locationMark = 0;
|
|
|
|
|
|
2009-10-16 17:33:12 +02:00
|
|
|
removeObject(m_manager);
|
2008-12-02 12:01:29 +01:00
|
|
|
delete m_manager;
|
|
|
|
|
m_manager = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2009-09-24 10:08:17 +02:00
|
|
|
static QString msgParameterMissing(const QString &a)
|
2009-05-25 16:22:11 +02:00
|
|
|
{
|
|
|
|
|
return DebuggerPlugin::tr("Option '%1' is missing the parameter.").arg(a);
|
|
|
|
|
}
|
|
|
|
|
|
2009-09-24 10:08:17 +02:00
|
|
|
static QString msgInvalidNumericParameter(const QString &a, const QString &number)
|
2009-05-25 16:22:11 +02:00
|
|
|
{
|
|
|
|
|
return DebuggerPlugin::tr("The parameter '%1' of option '%2' is not a number.").arg(number, a);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Parse arguments
|
|
|
|
|
bool DebuggerPlugin::parseArgument(QStringList::const_iterator &it,
|
2009-09-24 10:08:17 +02:00
|
|
|
const QStringList::const_iterator &cend,
|
2009-05-25 16:22:11 +02:00
|
|
|
QString *errorMessage)
|
|
|
|
|
{
|
|
|
|
|
const QString &option = *it;
|
|
|
|
|
// '-debug <pid>'
|
|
|
|
|
if (*it == QLatin1String("-debug")) {
|
|
|
|
|
++it;
|
|
|
|
|
if (it == cend) {
|
|
|
|
|
*errorMessage = msgParameterMissing(*it);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
bool ok;
|
|
|
|
|
m_cmdLineAttachPid = it->toULongLong(&ok);
|
|
|
|
|
if (!ok) {
|
2009-09-30 12:27:03 +02:00
|
|
|
m_cmdLineAttachPid = 0;
|
|
|
|
|
m_cmdLineAttachCore = *it;
|
2009-05-25 16:22:11 +02:00
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2009-05-26 16:27:24 +02:00
|
|
|
// -wincrashevent <event-handle>. A handle used for
|
|
|
|
|
// a handshake when attaching to a crashed Windows process.
|
|
|
|
|
if (*it == QLatin1String("-wincrashevent")) {
|
2009-05-25 16:22:11 +02:00
|
|
|
++it;
|
|
|
|
|
if (it == cend) {
|
|
|
|
|
*errorMessage = msgParameterMissing(*it);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
bool ok;
|
2009-05-26 16:27:24 +02:00
|
|
|
m_cmdLineWinCrashEvent = it->toULongLong(&ok);
|
2009-05-25 16:22:11 +02:00
|
|
|
if (!ok) {
|
|
|
|
|
*errorMessage = msgInvalidNumericParameter(option, *it);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
// engine disabling
|
|
|
|
|
if (option == QLatin1String("-disable-cdb")) {
|
|
|
|
|
m_cmdLineEnabledEngines &= ~CdbEngineType;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if (option == QLatin1String("-disable-gdb")) {
|
|
|
|
|
m_cmdLineEnabledEngines &= ~GdbEngineType;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if (option == QLatin1String("-disable-sdb")) {
|
|
|
|
|
m_cmdLineEnabledEngines &= ~ScriptEngineType;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*errorMessage = tr("Invalid debugger option: %1").arg(option);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DebuggerPlugin::parseArguments(const QStringList &args, QString *errorMessage)
|
|
|
|
|
{
|
|
|
|
|
const QStringList::const_iterator cend = args.constEnd();
|
|
|
|
|
for (QStringList::const_iterator it = args.constBegin(); it != cend; ++it)
|
|
|
|
|
if (!parseArgument(it, cend, errorMessage))
|
|
|
|
|
return false;
|
|
|
|
|
if (Debugger::Constants::Internal::debug)
|
2009-09-24 10:08:17 +02:00
|
|
|
qDebug().nospace() << args << "engines=0x"
|
|
|
|
|
<< QString::number(m_cmdLineEnabledEngines, 16)
|
2009-09-30 12:27:03 +02:00
|
|
|
<< " pid" << m_cmdLineAttachPid
|
|
|
|
|
<< " core" << m_cmdLineAttachCore << '\n';
|
2009-05-25 16:22:11 +02:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-16 14:22:13 +01:00
|
|
|
bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMessage)
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2009-05-26 16:27:24 +02:00
|
|
|
// Do not fail the whole plugin if something goes wrong here
|
|
|
|
|
if (!parseArguments(arguments, errorMessage)) {
|
2009-09-24 10:08:17 +02:00
|
|
|
*errorMessage = tr("Error evaluating command line arguments: %1")
|
|
|
|
|
.arg(*errorMessage);
|
2009-05-26 16:27:24 +02:00
|
|
|
qWarning("%s\n", qPrintable(*errorMessage));
|
|
|
|
|
errorMessage->clear();
|
|
|
|
|
}
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-04-17 09:03:32 +02:00
|
|
|
m_manager = new DebuggerManager;
|
2009-10-16 17:33:12 +02:00
|
|
|
ExtensionSystem::PluginManager::instance()->addObject(m_manager);
|
2009-09-24 10:08:17 +02:00
|
|
|
const QList<Core::IOptionsPage *> engineOptionPages =
|
|
|
|
|
m_manager->initializeEngines(m_cmdLineEnabledEngines);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-01-20 11:52:04 +01:00
|
|
|
ICore *core = ICore::instance();
|
2008-12-09 12:08:56 +01:00
|
|
|
QTC_ASSERT(core, return false);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
Core::ActionManager *am = core->actionManager();
|
|
|
|
|
QTC_ASSERT(am, return false);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
Core::UniqueIDManager *uidm = core->uniqueIDManager();
|
2008-12-09 12:08:56 +01:00
|
|
|
QTC_ASSERT(uidm, return false);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
QList<int> globalcontext;
|
|
|
|
|
globalcontext << Core::Constants::C_GLOBAL_ID;
|
|
|
|
|
|
|
|
|
|
QList<int> cppcontext;
|
|
|
|
|
cppcontext << uidm->uniqueIdentifier(ProjectExplorer::Constants::LANG_CXX);
|
|
|
|
|
|
|
|
|
|
QList<int> debuggercontext;
|
|
|
|
|
debuggercontext << uidm->uniqueIdentifier(C_GDBDEBUGGER);
|
|
|
|
|
|
|
|
|
|
QList<int> cppeditorcontext;
|
|
|
|
|
cppeditorcontext << uidm->uniqueIdentifier(CppEditor::Constants::C_CPPEDITOR);
|
|
|
|
|
|
|
|
|
|
QList<int> texteditorcontext;
|
|
|
|
|
texteditorcontext << uidm->uniqueIdentifier(TextEditor::Constants::C_TEXTEDITOR);
|
|
|
|
|
|
|
|
|
|
m_gdbRunningContext = uidm->uniqueIdentifier(Constants::GDBRUNNING);
|
|
|
|
|
|
2009-01-14 12:39:59 +01:00
|
|
|
//Core::ActionContainer *mcppcontext =
|
2009-01-13 17:41:23 +01:00
|
|
|
// am->actionContainer(CppEditor::Constants::M_CONTEXT);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-05-05 17:48:54 +02:00
|
|
|
// External apps
|
|
|
|
|
m_startExternalAction = new QAction(this);
|
|
|
|
|
m_startExternalAction->setText(tr("Start and Debug External Application..."));
|
|
|
|
|
connect(m_startExternalAction, SIGNAL(triggered()),
|
|
|
|
|
this, SLOT(startExternalApplication()));
|
|
|
|
|
|
|
|
|
|
m_attachExternalAction = new QAction(this);
|
|
|
|
|
m_attachExternalAction->setText(tr("Attach to Running External Application..."));
|
|
|
|
|
connect(m_attachExternalAction, SIGNAL(triggered()),
|
|
|
|
|
this, SLOT(attachExternalApplication()));
|
|
|
|
|
|
|
|
|
|
m_attachCoreAction = new QAction(this);
|
|
|
|
|
m_attachCoreAction->setText(tr("Attach to Core..."));
|
|
|
|
|
connect(m_attachCoreAction, SIGNAL(triggered()), this, SLOT(attachCore()));
|
|
|
|
|
|
2009-05-07 17:11:19 +02:00
|
|
|
|
2009-05-06 13:27:11 +02:00
|
|
|
m_startRemoteAction = new QAction(this);
|
|
|
|
|
m_startRemoteAction->setText(tr("Start and Attach to Remote Application..."));
|
|
|
|
|
connect(m_startRemoteAction, SIGNAL(triggered()),
|
|
|
|
|
this, SLOT(startRemoteApplication()));
|
2009-05-05 17:48:54 +02:00
|
|
|
|
|
|
|
|
|
2009-05-07 15:20:44 +02:00
|
|
|
m_detachAction = new QAction(this);
|
2009-06-11 15:00:21 +02:00
|
|
|
m_detachAction->setText(tr("Detach Debugger"));
|
2009-05-07 15:20:44 +02:00
|
|
|
connect(m_detachAction, SIGNAL(triggered()),
|
|
|
|
|
m_manager, SLOT(detachDebugger()));
|
|
|
|
|
|
2009-01-14 12:39:59 +01:00
|
|
|
Core::ActionContainer *mdebug =
|
2009-01-13 17:41:23 +01:00
|
|
|
am->actionContainer(ProjectExplorer::Constants::M_DEBUG);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-06-08 19:28:28 +02:00
|
|
|
Core::ActionContainer *mstart =
|
|
|
|
|
am->actionContainer(ProjectExplorer::Constants::M_DEBUG_STARTDEBUGGING);
|
|
|
|
|
|
2009-01-14 13:17:53 +01:00
|
|
|
Core::Command *cmd = 0;
|
2009-09-25 15:02:16 +02:00
|
|
|
const DebuggerManagerActions actions = m_manager->debuggerManagerActions();
|
|
|
|
|
cmd = am->registerAction(actions.continueAction,
|
2009-06-04 16:06:12 +02:00
|
|
|
ProjectExplorer::Constants::DEBUG, QList<int>() << m_gdbRunningContext);
|
2009-06-08 19:28:28 +02:00
|
|
|
mstart->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
|
2009-06-04 16:06:12 +02:00
|
|
|
|
2009-05-05 17:48:54 +02:00
|
|
|
cmd = am->registerAction(m_startExternalAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::STARTEXTERNAL, globalcontext);
|
2009-06-08 19:28:28 +02:00
|
|
|
mstart->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-05-05 17:48:54 +02:00
|
|
|
cmd = am->registerAction(m_attachExternalAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::ATTACHEXTERNAL, globalcontext);
|
2009-06-08 19:28:28 +02:00
|
|
|
mstart->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
|
2009-03-02 15:14:12 +01:00
|
|
|
|
2009-05-05 17:48:54 +02:00
|
|
|
cmd = am->registerAction(m_attachCoreAction,
|
|
|
|
|
Constants::ATTACHCORE, globalcontext);
|
2009-06-08 19:28:28 +02:00
|
|
|
mstart->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
|
2009-05-07 17:11:19 +02:00
|
|
|
|
2009-05-06 13:27:11 +02:00
|
|
|
cmd = am->registerAction(m_startRemoteAction,
|
2009-05-05 17:48:54 +02:00
|
|
|
Constants::ATTACHREMOTE, globalcontext);
|
2009-06-08 19:28:28 +02:00
|
|
|
mstart->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
|
2009-05-04 14:47:45 +02:00
|
|
|
|
2009-05-07 15:20:44 +02:00
|
|
|
cmd = am->registerAction(m_detachAction,
|
|
|
|
|
Constants::DETACH, globalcontext);
|
|
|
|
|
mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-09-25 15:02:16 +02:00
|
|
|
cmd = am->registerAction(actions.stopAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::INTERRUPT, globalcontext);
|
2009-01-14 13:17:53 +01:00
|
|
|
cmd->setAttribute(Core::Command::CA_UpdateText);
|
|
|
|
|
cmd->setAttribute(Core::Command::CA_UpdateIcon);
|
2008-12-02 12:01:29 +01:00
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::INTERRUPT_KEY));
|
|
|
|
|
cmd->setDefaultText(tr("Stop Debugger/Interrupt Debugger"));
|
|
|
|
|
mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
|
|
|
|
|
|
2009-09-25 15:02:16 +02:00
|
|
|
cmd = am->registerAction(actions.resetAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::RESET, globalcontext);
|
2009-01-14 13:17:53 +01:00
|
|
|
cmd->setAttribute(Core::Command::CA_UpdateText);
|
2008-12-02 12:01:29 +01:00
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::RESET_KEY));
|
|
|
|
|
cmd->setDefaultText(tr("Reset Debugger"));
|
|
|
|
|
//disabled mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
|
|
|
|
|
|
|
|
|
|
QAction *sep = new QAction(this);
|
|
|
|
|
sep->setSeparator(true);
|
2009-07-09 18:27:56 +02:00
|
|
|
cmd = am->registerAction(sep, QLatin1String("Debugger.Sep.Step"), globalcontext);
|
2008-12-02 12:01:29 +01:00
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-09-25 15:02:16 +02:00
|
|
|
cmd = am->registerAction(actions.nextAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::NEXT, debuggercontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::NEXT_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-09-25 15:02:16 +02:00
|
|
|
cmd = am->registerAction(actions.stepAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::STEP, debuggercontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::STEP_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-09-25 15:02:16 +02:00
|
|
|
cmd = am->registerAction(actions.stepOutAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::STEPOUT, debuggercontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::STEPOUT_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-09-25 15:02:16 +02:00
|
|
|
cmd = am->registerAction(actions.runToLineAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::RUN_TO_LINE, debuggercontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::RUN_TO_LINE_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-09-25 15:02:16 +02:00
|
|
|
cmd = am->registerAction(actions.runToFunctionAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::RUN_TO_FUNCTION, debuggercontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::RUN_TO_FUNCTION_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-09-25 15:02:16 +02:00
|
|
|
cmd = am->registerAction(actions.jumpToLineAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::JUMP_TO_LINE, debuggercontext);
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-06-04 16:15:01 +02:00
|
|
|
#ifdef USE_REVERSE_DEBUGGING
|
2009-09-25 15:02:16 +02:00
|
|
|
cmd = am->registerAction(actions.reverseDirectionAction,
|
2009-05-25 17:19:42 +02:00
|
|
|
Constants::REVERSE, debuggercontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::REVERSE_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
2009-06-04 16:15:01 +02:00
|
|
|
#endif
|
2009-05-25 17:19:42 +02:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
sep = new QAction(this);
|
|
|
|
|
sep->setSeparator(true);
|
2009-07-09 18:27:56 +02:00
|
|
|
cmd = am->registerAction(sep, QLatin1String("Debugger.Sep.Break"), globalcontext);
|
2008-12-02 12:01:29 +01:00
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-09-29 11:13:19 +02:00
|
|
|
cmd = am->registerAction(theDebuggerAction(OperateByInstruction),
|
|
|
|
|
Constants::OPERATE_BY_INSTRUCTION, debuggercontext);
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-09-25 15:02:16 +02:00
|
|
|
cmd = am->registerAction(actions.breakAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::TOGGLE_BREAK, cppeditorcontext);
|
|
|
|
|
cmd->setDefaultKeySequence(QKeySequence(Constants::TOGGLE_BREAK_KEY));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
//mcppcontext->addAction(cmd);
|
|
|
|
|
|
|
|
|
|
sep = new QAction(this);
|
|
|
|
|
sep->setSeparator(true);
|
2009-07-09 18:27:56 +02:00
|
|
|
cmd = am->registerAction(sep, QLatin1String("Debugger.Sep.Watch"), globalcontext);
|
2008-12-02 12:01:29 +01:00
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-09-25 15:02:16 +02:00
|
|
|
cmd = am->registerAction(actions.watchAction,
|
2008-12-02 12:01:29 +01:00
|
|
|
Constants::ADD_TO_WATCH, cppeditorcontext);
|
|
|
|
|
//cmd->setDefaultKeySequence(QKeySequence(tr("ALT+D,ALT+W")));
|
|
|
|
|
mdebug->addAction(cmd);
|
|
|
|
|
|
2009-01-13 17:41:23 +01:00
|
|
|
// Views menu
|
2009-07-09 18:27:56 +02:00
|
|
|
cmd = am->registerAction(sep, QLatin1String("Debugger.Sep.Views"), globalcontext);
|
2009-01-13 17:41:23 +01:00
|
|
|
mdebug->addAction(cmd);
|
2009-01-14 12:39:59 +01:00
|
|
|
ActionContainer *viewsMenu = am->createMenu(Constants::M_DEBUG_VIEWS);
|
2009-01-13 17:41:23 +01:00
|
|
|
QMenu *m = viewsMenu->menu();
|
|
|
|
|
m->setEnabled(true);
|
|
|
|
|
m->setTitle(tr("&Views"));
|
|
|
|
|
mdebug->addMenu(viewsMenu, Core::Constants::G_DEFAULT_THREE);
|
|
|
|
|
|
|
|
|
|
m_toggleLockedAction = new QAction(tr("Locked"), this);
|
|
|
|
|
m_toggleLockedAction->setCheckable(true);
|
|
|
|
|
m_toggleLockedAction->setChecked(true);
|
|
|
|
|
connect(m_toggleLockedAction, SIGNAL(toggled(bool)),
|
2009-08-06 16:01:51 +02:00
|
|
|
m_manager->mainWindow(), SLOT(setLocked(bool)));
|
|
|
|
|
foreach (QDockWidget *dockWidget, m_manager->mainWindow()->dockWidgets()) {
|
2009-01-13 17:41:23 +01:00
|
|
|
cmd = am->registerAction(dockWidget->toggleViewAction(),
|
|
|
|
|
"Debugger." + dockWidget->objectName(), debuggercontext);
|
|
|
|
|
viewsMenu->addAction(cmd);
|
|
|
|
|
//m->addAction(dockWidget->toggleViewAction());
|
|
|
|
|
}
|
|
|
|
|
m->addSeparator();
|
|
|
|
|
m->addAction(m_toggleLockedAction);
|
|
|
|
|
m->addSeparator();
|
|
|
|
|
|
|
|
|
|
QAction *resetToSimpleAction = viewsMenu->menu()->addAction(tr("Reset to default layout"));
|
|
|
|
|
connect(resetToSimpleAction, SIGNAL(triggered()),
|
|
|
|
|
m_manager, SLOT(setSimpleDockWidgetArrangement()));
|
|
|
|
|
|
2009-08-13 16:16:19 +02:00
|
|
|
// FIXME:
|
2009-04-17 09:03:32 +02:00
|
|
|
addAutoReleasedObject(new CommonOptionsPage);
|
2009-05-25 16:22:11 +02:00
|
|
|
addAutoReleasedObject(new DebuggingHelperOptionPage);
|
2009-04-17 09:03:32 +02:00
|
|
|
foreach (Core::IOptionsPage* op, engineOptionPages)
|
|
|
|
|
addAutoReleasedObject(op);
|
2009-10-26 18:05:11 +01:00
|
|
|
addAutoReleasedObject(new DebuggerListener);
|
2008-12-02 12:01:29 +01:00
|
|
|
m_locationMark = 0;
|
|
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Debug mode setup
|
|
|
|
|
//
|
|
|
|
|
m_debugMode = new DebugMode(this);
|
2008-12-02 12:01:29 +01:00
|
|
|
//addAutoReleasedObject(m_debugMode);
|
|
|
|
|
|
2009-05-05 17:48:54 +02:00
|
|
|
// register factory of DebuggerRunControl
|
2009-09-25 11:35:44 +02:00
|
|
|
m_debuggerRunControlFactory = new DebuggerRunControlFactory(m_manager);
|
|
|
|
|
addAutoReleasedObject(m_debuggerRunControlFactory);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
QList<int> context;
|
|
|
|
|
context.append(uidm->uniqueIdentifier(Core::Constants::C_EDITORMANAGER));
|
|
|
|
|
context.append(uidm->uniqueIdentifier(Debugger::Constants::C_GDBDEBUGGER));
|
|
|
|
|
context.append(uidm->uniqueIdentifier(Core::Constants::C_NAVIGATION_PANE));
|
|
|
|
|
m_debugMode->setContext(context);
|
|
|
|
|
|
|
|
|
|
QBoxLayout *editorHolderLayout = new QVBoxLayout;
|
|
|
|
|
editorHolderLayout->setMargin(0);
|
|
|
|
|
editorHolderLayout->setSpacing(0);
|
|
|
|
|
|
|
|
|
|
QWidget *editorAndFindWidget = new QWidget;
|
|
|
|
|
editorAndFindWidget->setLayout(editorHolderLayout);
|
2009-07-21 11:10:02 +02:00
|
|
|
editorHolderLayout->addWidget(new EditorManagerPlaceHolder(m_debugMode));
|
|
|
|
|
editorHolderLayout->addWidget(new FindToolBarPlaceHolder(editorAndFindWidget));
|
2009-01-13 18:15:24 +01:00
|
|
|
|
|
|
|
|
MiniSplitter *rightPaneSplitter = new MiniSplitter;
|
|
|
|
|
rightPaneSplitter->addWidget(editorAndFindWidget);
|
|
|
|
|
rightPaneSplitter->addWidget(new RightPanePlaceHolder(m_debugMode));
|
|
|
|
|
rightPaneSplitter->setStretchFactor(0, 1);
|
|
|
|
|
rightPaneSplitter->setStretchFactor(1, 0);
|
|
|
|
|
|
|
|
|
|
QWidget *centralWidget = new QWidget;
|
|
|
|
|
|
|
|
|
|
m_manager->mainWindow()->setCentralWidget(centralWidget);
|
|
|
|
|
|
|
|
|
|
MiniSplitter *splitter = new MiniSplitter;
|
|
|
|
|
splitter->addWidget(m_manager->mainWindow());
|
|
|
|
|
splitter->addWidget(new OutputPanePlaceHolder(m_debugMode));
|
|
|
|
|
splitter->setStretchFactor(0, 10);
|
|
|
|
|
splitter->setStretchFactor(1, 0);
|
|
|
|
|
splitter->setOrientation(Qt::Vertical);
|
|
|
|
|
|
|
|
|
|
MiniSplitter *splitter2 = new MiniSplitter;
|
|
|
|
|
splitter2->addWidget(new NavigationWidgetPlaceHolder(m_debugMode));
|
|
|
|
|
splitter2->addWidget(splitter);
|
|
|
|
|
splitter2->setStretchFactor(0, 0);
|
|
|
|
|
splitter2->setStretchFactor(1, 1);
|
|
|
|
|
|
|
|
|
|
m_debugMode->setWidget(splitter2);
|
|
|
|
|
|
2009-10-05 11:06:05 +02:00
|
|
|
Utils::StyledBar *debugToolBar = new Utils::StyledBar;
|
2009-02-04 12:46:38 +01:00
|
|
|
debugToolBar->setProperty("topBorder", true);
|
2009-07-16 15:57:59 +02:00
|
|
|
QHBoxLayout *debugToolBarLayout = new QHBoxLayout(debugToolBar);
|
|
|
|
|
debugToolBarLayout->setMargin(0);
|
|
|
|
|
debugToolBarLayout->setSpacing(0);
|
|
|
|
|
debugToolBarLayout->addWidget(toolButton(am->command(ProjectExplorer::Constants::DEBUG)->action()));
|
|
|
|
|
debugToolBarLayout->addWidget(toolButton(am->command(Constants::INTERRUPT)->action()));
|
|
|
|
|
debugToolBarLayout->addWidget(toolButton(am->command(Constants::NEXT)->action()));
|
|
|
|
|
debugToolBarLayout->addWidget(toolButton(am->command(Constants::STEP)->action()));
|
|
|
|
|
debugToolBarLayout->addWidget(toolButton(am->command(Constants::STEPOUT)->action()));
|
2009-09-29 11:13:19 +02:00
|
|
|
debugToolBarLayout->addWidget(toolButton(am->command(Constants::OPERATE_BY_INSTRUCTION)->action()));
|
2009-06-04 16:15:01 +02:00
|
|
|
#ifdef USE_REVERSE_DEBUGGING
|
2009-10-05 11:06:05 +02:00
|
|
|
debugToolBarLayout->addWidget(new Utils::StyledSeparator);
|
2009-07-16 15:57:59 +02:00
|
|
|
debugToolBarLayout->addWidget(toolButton(am->command(Constants::REVERSE)->action()));
|
2009-06-04 16:15:01 +02:00
|
|
|
#endif
|
2009-10-05 11:06:05 +02:00
|
|
|
debugToolBarLayout->addWidget(new Utils::StyledSeparator);
|
2009-07-16 15:57:59 +02:00
|
|
|
debugToolBarLayout->addWidget(new QLabel(tr("Threads:")));
|
2009-01-13 18:15:24 +01:00
|
|
|
|
|
|
|
|
QComboBox *threadBox = new QComboBox;
|
|
|
|
|
threadBox->setModel(m_manager->threadsModel());
|
|
|
|
|
connect(threadBox, SIGNAL(activated(int)),
|
|
|
|
|
m_manager->threadsWindow(), SIGNAL(threadSelected(int)));
|
2009-07-16 15:57:59 +02:00
|
|
|
debugToolBarLayout->addWidget(threadBox);
|
|
|
|
|
debugToolBarLayout->addWidget(m_manager->statusLabel(), 10);
|
2009-01-13 18:15:24 +01:00
|
|
|
|
|
|
|
|
QBoxLayout *toolBarAddingLayout = new QVBoxLayout(centralWidget);
|
|
|
|
|
toolBarAddingLayout->setMargin(0);
|
|
|
|
|
toolBarAddingLayout->setSpacing(0);
|
|
|
|
|
toolBarAddingLayout->addWidget(rightPaneSplitter);
|
|
|
|
|
toolBarAddingLayout->addWidget(debugToolBar);
|
|
|
|
|
|
|
|
|
|
m_manager->setSimpleDockWidgetArrangement();
|
|
|
|
|
readSettings();
|
|
|
|
|
|
|
|
|
|
connect(ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)),
|
2009-05-15 16:54:54 +02:00
|
|
|
this, SLOT(onModeChanged(Core::IMode*)));
|
2009-01-13 18:15:24 +01:00
|
|
|
m_debugMode->widget()->setFocusProxy(EditorManager::instance());
|
|
|
|
|
addObject(m_debugMode);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Connections
|
|
|
|
|
//
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
// ProjectExplorer
|
2009-01-28 14:29:54 +01:00
|
|
|
connect(sessionManager(), SIGNAL(sessionLoaded()),
|
2008-12-02 12:01:29 +01:00
|
|
|
m_manager, SLOT(sessionLoaded()));
|
2009-01-28 14:29:54 +01:00
|
|
|
connect(sessionManager(), SIGNAL(aboutToSaveSession()),
|
2008-12-02 12:01:29 +01:00
|
|
|
m_manager, SLOT(aboutToSaveSession()));
|
2009-08-13 17:10:53 +02:00
|
|
|
connect(sessionManager(), SIGNAL(aboutToUnloadSession()),
|
|
|
|
|
m_manager, SLOT(aboutToUnloadSession()));
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
// EditorManager
|
|
|
|
|
QObject *editorManager = core->editorManager();
|
|
|
|
|
connect(editorManager, SIGNAL(editorAboutToClose(Core::IEditor*)),
|
|
|
|
|
this, SLOT(editorAboutToClose(Core::IEditor*)));
|
|
|
|
|
connect(editorManager, SIGNAL(editorOpened(Core::IEditor*)),
|
|
|
|
|
this, SLOT(editorOpened(Core::IEditor*)));
|
|
|
|
|
|
|
|
|
|
// Application interaction
|
|
|
|
|
connect(m_manager, SIGNAL(currentTextEditorRequested(QString*,int*,QObject**)),
|
|
|
|
|
this, SLOT(queryCurrentTextEditor(QString*,int*,QObject**)));
|
|
|
|
|
|
|
|
|
|
connect(m_manager, SIGNAL(setSessionValueRequested(QString,QVariant)),
|
|
|
|
|
this, SLOT(setSessionValue(QString,QVariant)));
|
|
|
|
|
connect(m_manager, SIGNAL(sessionValueRequested(QString,QVariant*)),
|
|
|
|
|
this, SLOT(querySessionValue(QString,QVariant*)));
|
|
|
|
|
|
|
|
|
|
connect(m_manager, SIGNAL(resetLocationRequested()),
|
|
|
|
|
this, SLOT(resetLocation()));
|
2009-09-29 15:21:28 +02:00
|
|
|
connect(m_manager, SIGNAL(gotoLocationRequested(QString,int,bool)),
|
|
|
|
|
this, SLOT(gotoLocation(QString,int,bool)));
|
2009-09-25 08:35:31 +02:00
|
|
|
connect(m_manager, SIGNAL(stateChanged(int)),
|
|
|
|
|
this, SLOT(handleStateChanged(int)));
|
2008-12-02 12:01:29 +01:00
|
|
|
connect(m_manager, SIGNAL(previousModeRequested()),
|
|
|
|
|
this, SLOT(activatePreviousMode()));
|
|
|
|
|
connect(m_manager, SIGNAL(debugModeRequested()),
|
|
|
|
|
this, SLOT(activateDebugMode()));
|
|
|
|
|
|
2009-03-19 15:54:52 +01:00
|
|
|
connect(theDebuggerAction(SettingsDialog), SIGNAL(triggered()),
|
2009-02-27 11:41:19 +01:00
|
|
|
this, SLOT(showSettingsDialog()));
|
|
|
|
|
|
2009-09-30 13:07:14 +02:00
|
|
|
handleStateChanged(DebuggerNotReady);
|
2008-12-02 12:01:29 +01:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::extensionsInitialized()
|
|
|
|
|
{
|
2009-04-06 10:58:48 +02:00
|
|
|
// time gdb -i mi -ex 'debuggerplugin.cpp:800' -ex r -ex q bin/qtcreator.bin
|
2009-05-25 16:22:11 +02:00
|
|
|
const QByteArray env = qgetenv("QTC_DEBUGGER_TEST");
|
2009-04-07 09:40:56 +02:00
|
|
|
//qDebug() << "EXTENSIONS INITIALIZED:" << env;
|
2009-04-06 16:30:11 +02:00
|
|
|
if (!env.isEmpty())
|
|
|
|
|
m_manager->runTest(QString::fromLocal8Bit(env));
|
2009-05-25 16:22:11 +02:00
|
|
|
if (m_cmdLineAttachPid)
|
|
|
|
|
QTimer::singleShot(0, this, SLOT(attachCmdLinePid()));
|
2009-09-30 12:27:03 +02:00
|
|
|
if (!m_cmdLineAttachCore.isEmpty())
|
|
|
|
|
QTimer::singleShot(0, this, SLOT(attachCmdLineCore()));
|
2009-05-25 16:22:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::attachCmdLinePid()
|
|
|
|
|
{
|
2009-05-26 16:27:24 +02:00
|
|
|
m_manager->showStatusMessage(tr("Attaching to PID %1.").arg(m_cmdLineAttachPid));
|
2009-09-17 16:51:27 +02:00
|
|
|
const QString crashParameter =
|
|
|
|
|
m_cmdLineWinCrashEvent ? QString::number(m_cmdLineWinCrashEvent) : QString();
|
2009-05-26 16:27:24 +02:00
|
|
|
attachExternalApplication(m_cmdLineAttachPid, crashParameter);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*! Activates the previous mode when the current mode is the debug mode. */
|
|
|
|
|
void DebuggerPlugin::activatePreviousMode()
|
|
|
|
|
{
|
2009-01-20 11:52:04 +01:00
|
|
|
Core::ModeManager *const modeManager = ICore::instance()->modeManager();
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
if (modeManager->currentMode() == modeManager->mode(Constants::MODE_DEBUG)
|
|
|
|
|
&& !m_previousMode.isEmpty()) {
|
|
|
|
|
modeManager->activateMode(m_previousMode);
|
|
|
|
|
m_previousMode.clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::activateDebugMode()
|
|
|
|
|
{
|
2009-01-21 15:52:34 +01:00
|
|
|
ModeManager *modeManager = ModeManager::instance();
|
2008-12-02 12:01:29 +01:00
|
|
|
m_previousMode = QLatin1String(modeManager->currentMode()->uniqueModeName());
|
|
|
|
|
modeManager->activateMode(QLatin1String(MODE_DEBUG));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::queryCurrentTextEditor(QString *fileName, int *lineNumber, QObject **object)
|
|
|
|
|
{
|
2009-01-21 15:52:34 +01:00
|
|
|
EditorManager *editorManager = EditorManager::instance();
|
|
|
|
|
if (!editorManager)
|
2008-12-02 12:01:29 +01:00
|
|
|
return;
|
2009-01-21 15:52:34 +01:00
|
|
|
Core::IEditor *editor = editorManager->currentEditor();
|
2008-12-02 12:01:29 +01:00
|
|
|
ITextEditor *textEditor = qobject_cast<ITextEditor*>(editor);
|
|
|
|
|
if (!textEditor)
|
|
|
|
|
return;
|
|
|
|
|
if (fileName)
|
|
|
|
|
*fileName = textEditor->file()->fileName();
|
|
|
|
|
if (lineNumber)
|
|
|
|
|
*lineNumber = textEditor->currentLine();
|
|
|
|
|
if (object)
|
|
|
|
|
*object = textEditor->widget();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::editorOpened(Core::IEditor *editor)
|
|
|
|
|
{
|
|
|
|
|
if (ITextEditor *textEditor = qobject_cast<ITextEditor *>(editor)) {
|
|
|
|
|
connect(textEditor, SIGNAL(markRequested(TextEditor::ITextEditor*,int)),
|
|
|
|
|
this, SLOT(requestMark(TextEditor::ITextEditor*,int)));
|
|
|
|
|
connect(editor, SIGNAL(tooltipRequested(TextEditor::ITextEditor*,QPoint,int)),
|
|
|
|
|
this, SLOT(showToolTip(TextEditor::ITextEditor*,QPoint,int)));
|
2008-12-05 16:39:33 +01:00
|
|
|
connect(textEditor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
|
|
|
|
|
this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::editorAboutToClose(Core::IEditor *editor)
|
|
|
|
|
{
|
|
|
|
|
if (ITextEditor *textEditor = qobject_cast<ITextEditor *>(editor)) {
|
|
|
|
|
disconnect(textEditor, SIGNAL(markRequested(TextEditor::ITextEditor*,int)),
|
|
|
|
|
this, SLOT(requestMark(TextEditor::ITextEditor*,int)));
|
|
|
|
|
disconnect(editor, SIGNAL(tooltipRequested(TextEditor::ITextEditor*,QPoint,int)),
|
|
|
|
|
this, SLOT(showToolTip(TextEditor::ITextEditor*,QPoint,int)));
|
2008-12-05 16:39:33 +01:00
|
|
|
disconnect(textEditor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
|
|
|
|
|
this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2008-12-05 16:39:33 +01:00
|
|
|
void DebuggerPlugin::requestContextMenu(TextEditor::ITextEditor *editor,
|
|
|
|
|
int lineNumber, QMenu *menu)
|
|
|
|
|
{
|
2009-04-28 15:08:52 +02:00
|
|
|
QString fileName = editor->file()->fileName();
|
|
|
|
|
QString position = fileName + QString(":%1").arg(lineNumber);
|
|
|
|
|
BreakpointData *data = m_manager->findBreakpoint(fileName, lineNumber);
|
|
|
|
|
|
|
|
|
|
if (data) {
|
|
|
|
|
// existing breakpoint
|
|
|
|
|
QAction *act = new QAction(tr("Remove Breakpoint"), menu);
|
|
|
|
|
act->setData(position);
|
|
|
|
|
connect(act, SIGNAL(triggered()),
|
|
|
|
|
this, SLOT(breakpointSetRemoveMarginActionTriggered()));
|
|
|
|
|
menu->addAction(act);
|
|
|
|
|
|
|
|
|
|
QAction *act2;
|
|
|
|
|
if (data->enabled)
|
|
|
|
|
act2 = new QAction(tr("Disable Breakpoint"), menu);
|
|
|
|
|
else
|
|
|
|
|
act2 = new QAction(tr("Enable Breakpoint"), menu);
|
|
|
|
|
act2->setData(position);
|
|
|
|
|
connect(act2, SIGNAL(triggered()),
|
|
|
|
|
this, SLOT(breakpointEnableDisableMarginActionTriggered()));
|
|
|
|
|
menu->addAction(act2);
|
|
|
|
|
} else {
|
|
|
|
|
// non-existing
|
|
|
|
|
QAction *act = new QAction(tr("Set Breakpoint"), menu);
|
|
|
|
|
act->setData(position);
|
|
|
|
|
connect(act, SIGNAL(triggered()),
|
|
|
|
|
this, SLOT(breakpointSetRemoveMarginActionTriggered()));
|
|
|
|
|
menu->addAction(act);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::breakpointSetRemoveMarginActionTriggered()
|
|
|
|
|
{
|
|
|
|
|
if (QAction *act = qobject_cast<QAction *>(sender())) {
|
|
|
|
|
QString str = act->data().toString();
|
|
|
|
|
int pos = str.lastIndexOf(':');
|
|
|
|
|
m_manager->toggleBreakpoint(str.left(pos), str.mid(pos + 1).toInt());
|
|
|
|
|
}
|
2008-12-05 16:39:33 +01:00
|
|
|
}
|
|
|
|
|
|
2009-04-28 15:08:52 +02:00
|
|
|
void DebuggerPlugin::breakpointEnableDisableMarginActionTriggered()
|
2008-12-05 16:39:33 +01:00
|
|
|
{
|
2009-04-28 15:08:52 +02:00
|
|
|
if (QAction *act = qobject_cast<QAction *>(sender())) {
|
|
|
|
|
QString str = act->data().toString();
|
|
|
|
|
int pos = str.lastIndexOf(':');
|
|
|
|
|
m_manager->toggleBreakpointEnabled(str.left(pos), str.mid(pos + 1).toInt());
|
|
|
|
|
}
|
2008-12-05 16:39:33 +01:00
|
|
|
}
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
void DebuggerPlugin::requestMark(TextEditor::ITextEditor *editor, int lineNumber)
|
|
|
|
|
{
|
|
|
|
|
m_manager->toggleBreakpoint(editor->file()->fileName(), lineNumber);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::showToolTip(TextEditor::ITextEditor *editor,
|
|
|
|
|
const QPoint &point, int pos)
|
|
|
|
|
{
|
2009-09-23 16:11:25 +02:00
|
|
|
if (!theDebuggerBoolSetting(UseToolTipsInMainEditor)
|
2009-09-25 08:35:31 +02:00
|
|
|
|| m_manager->state() == DebuggerNotReady)
|
2008-12-08 19:26:00 +01:00
|
|
|
return;
|
|
|
|
|
|
2009-05-14 14:29:37 +02:00
|
|
|
m_manager->setToolTipExpression(point, editor, pos);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::setSessionValue(const QString &name, const QVariant &value)
|
|
|
|
|
{
|
|
|
|
|
//qDebug() << "SET SESSION VALUE" << name << value;
|
2009-01-28 14:29:54 +01:00
|
|
|
QTC_ASSERT(sessionManager(), return);
|
|
|
|
|
sessionManager()->setValue(name, value);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::querySessionValue(const QString &name, QVariant *value)
|
|
|
|
|
{
|
2009-01-28 14:29:54 +01:00
|
|
|
QTC_ASSERT(sessionManager(), return);
|
|
|
|
|
*value = sessionManager()->value(name);
|
2008-12-02 12:01:29 +01:00
|
|
|
//qDebug() << "GET SESSION VALUE: " << name << value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::setConfigValue(const QString &name, const QVariant &value)
|
|
|
|
|
{
|
2008-12-09 12:08:56 +01:00
|
|
|
QTC_ASSERT(m_debugMode, return);
|
2009-01-13 18:15:24 +01:00
|
|
|
settings()->setValue(name, value);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2009-05-25 16:22:11 +02:00
|
|
|
QVariant DebuggerPlugin::configValue(const QString &name) const
|
|
|
|
|
{
|
|
|
|
|
QTC_ASSERT(m_debugMode, return QVariant());
|
|
|
|
|
return settings()->value(name);
|
|
|
|
|
}
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
void DebuggerPlugin::queryConfigValue(const QString &name, QVariant *value)
|
|
|
|
|
{
|
2008-12-09 12:08:56 +01:00
|
|
|
QTC_ASSERT(m_debugMode, return);
|
2009-01-13 18:15:24 +01:00
|
|
|
*value = settings()->value(name);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::resetLocation()
|
|
|
|
|
{
|
|
|
|
|
//qDebug() << "RESET_LOCATION: current:" << currentTextEditor();
|
|
|
|
|
//qDebug() << "RESET_LOCATION: locations:" << m_locationMark;
|
|
|
|
|
//qDebug() << "RESET_LOCATION: stored:" << m_locationMark->editor();
|
|
|
|
|
delete m_locationMark;
|
|
|
|
|
m_locationMark = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2009-09-29 15:21:28 +02:00
|
|
|
void DebuggerPlugin::gotoLocation(const QString &file, int line, bool setMarker)
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2009-09-29 15:21:28 +02:00
|
|
|
TextEditor::BaseTextEditor::openEditorAt(file, line);
|
|
|
|
|
if (setMarker) {
|
|
|
|
|
resetLocation();
|
|
|
|
|
m_locationMark = new LocationMark(file, line);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-09-25 08:35:31 +02:00
|
|
|
void DebuggerPlugin::handleStateChanged(int state)
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2009-09-25 08:35:31 +02:00
|
|
|
const bool startIsContinue = (state == InferiorStopped);
|
2009-01-20 11:52:04 +01:00
|
|
|
ICore *core = ICore::instance();
|
2008-12-02 12:01:29 +01:00
|
|
|
if (startIsContinue) {
|
|
|
|
|
core->addAdditionalContext(m_gdbRunningContext);
|
|
|
|
|
core->updateContext();
|
|
|
|
|
} else {
|
|
|
|
|
core->removeAdditionalContext(m_gdbRunningContext);
|
|
|
|
|
core->updateContext();
|
|
|
|
|
}
|
2009-09-24 10:08:17 +02:00
|
|
|
|
2009-09-25 08:35:31 +02:00
|
|
|
const bool started = state == InferiorRunning
|
|
|
|
|
|| state == InferiorRunningRequested
|
|
|
|
|
|| state == InferiorStopping
|
|
|
|
|
|| state == InferiorStopped;
|
2009-09-24 10:08:17 +02:00
|
|
|
|
2009-09-25 08:35:31 +02:00
|
|
|
const bool starting = state == EngineStarting;
|
|
|
|
|
//const bool running = state == InferiorRunning;
|
2009-09-24 10:08:17 +02:00
|
|
|
|
2009-09-30 13:07:14 +02:00
|
|
|
const bool detachable = state == InferiorStopped
|
|
|
|
|
&& m_manager->startParameters()->startMode != AttachCore;
|
2009-09-24 10:08:17 +02:00
|
|
|
|
|
|
|
|
m_startExternalAction->setEnabled(!started && !starting);
|
|
|
|
|
m_attachExternalAction->setEnabled(!started && !starting);
|
|
|
|
|
#ifdef Q_OS_WIN
|
|
|
|
|
m_attachCoreAction->setEnabled(false);
|
|
|
|
|
#else
|
|
|
|
|
m_attachCoreAction->setEnabled(!started && !starting);
|
|
|
|
|
#endif
|
|
|
|
|
m_startRemoteAction->setEnabled(!started && !starting);
|
2009-09-30 13:07:14 +02:00
|
|
|
m_detachAction->setEnabled(detachable);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
void DebuggerPlugin::writeSettings() const
|
|
|
|
|
{
|
|
|
|
|
QTC_ASSERT(m_manager, return);
|
|
|
|
|
QTC_ASSERT(m_manager->mainWindow(), return);
|
2009-01-14 18:09:02 +01:00
|
|
|
|
|
|
|
|
QSettings *s = settings();
|
2009-04-08 12:11:30 +02:00
|
|
|
DebuggerSettings::instance()->writeSettings(s);
|
2009-01-13 18:15:24 +01:00
|
|
|
s->beginGroup(QLatin1String("DebugMode"));
|
2009-08-06 16:01:51 +02:00
|
|
|
m_manager->mainWindow()->saveSettings(s);
|
2009-01-13 18:15:24 +01:00
|
|
|
s->endGroup();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::readSettings()
|
|
|
|
|
{
|
|
|
|
|
QSettings *s = settings();
|
2009-04-08 12:11:30 +02:00
|
|
|
DebuggerSettings::instance()->readSettings(s);
|
2009-01-14 18:09:02 +01:00
|
|
|
|
|
|
|
|
QString defaultCommand("gdb");
|
2009-06-03 20:45:49 +02:00
|
|
|
#ifdef Q_OS_WIN
|
2009-01-14 18:09:02 +01:00
|
|
|
defaultCommand.append(".exe");
|
|
|
|
|
#endif
|
2009-01-23 17:20:51 +01:00
|
|
|
//QString defaultScript = ICore::instance()->resourcePath() +
|
|
|
|
|
// QLatin1String("/gdb/qt4macros");
|
|
|
|
|
QString defaultScript;
|
2009-01-14 18:09:02 +01:00
|
|
|
|
2009-01-13 18:15:24 +01:00
|
|
|
s->beginGroup(QLatin1String("DebugMode"));
|
2009-08-06 16:01:51 +02:00
|
|
|
m_manager->mainWindow()->restoreSettings(s);
|
|
|
|
|
m_toggleLockedAction->setChecked(m_manager->mainWindow()->isLocked());
|
2009-01-13 18:15:24 +01:00
|
|
|
s->endGroup();
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-15 16:54:54 +02:00
|
|
|
void DebuggerPlugin::onModeChanged(IMode *mode)
|
2009-01-13 18:15:24 +01:00
|
|
|
{
|
2009-05-25 18:21:31 +02:00
|
|
|
// FIXME: This one gets always called, even if switching between modes
|
|
|
|
|
// different then the debugger mode. E.g. Welcome and Help mode and
|
|
|
|
|
// also on shutdown.
|
|
|
|
|
|
2009-08-14 13:04:05 +02:00
|
|
|
if (mode != m_debugMode)
|
2009-01-13 18:15:24 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
EditorManager *editorManager = EditorManager::instance();
|
|
|
|
|
if (editorManager->currentEditor())
|
|
|
|
|
editorManager->currentEditor()->widget()->setFocus();
|
|
|
|
|
}
|
|
|
|
|
|
2009-02-27 11:41:19 +01:00
|
|
|
void DebuggerPlugin::showSettingsDialog()
|
|
|
|
|
{
|
2009-04-28 15:08:52 +02:00
|
|
|
Core::ICore::instance()->showOptionsDialog(
|
|
|
|
|
QLatin1String(Debugger::Constants::DEBUGGER_SETTINGS_CATEGORY),
|
|
|
|
|
QLatin1String(Debugger::Constants::DEBUGGER_COMMON_SETTINGS_PAGE));
|
2009-02-27 11:41:19 +01:00
|
|
|
}
|
|
|
|
|
|
2009-05-05 17:48:54 +02:00
|
|
|
void DebuggerPlugin::startExternalApplication()
|
|
|
|
|
{
|
2009-09-17 14:30:28 +02:00
|
|
|
const DebuggerStartParametersPtr sp(new DebuggerStartParameters);
|
2009-05-25 16:22:11 +02:00
|
|
|
StartExternalDialog dlg(m_manager->mainWindow());
|
|
|
|
|
dlg.setExecutableFile(
|
|
|
|
|
configValue(_("LastExternalExecutableFile")).toString());
|
|
|
|
|
dlg.setExecutableArguments(
|
|
|
|
|
configValue(_("LastExternalExecutableArguments")).toString());
|
2009-06-12 12:57:22 +02:00
|
|
|
if (dlg.exec() != QDialog::Accepted)
|
2009-05-25 16:22:11 +02:00
|
|
|
return;
|
2009-06-12 12:57:22 +02:00
|
|
|
|
2009-05-25 16:22:11 +02:00
|
|
|
setConfigValue(_("LastExternalExecutableFile"),
|
|
|
|
|
dlg.executableFile());
|
|
|
|
|
setConfigValue(_("LastExternalExecutableArguments"),
|
|
|
|
|
dlg.executableArguments());
|
|
|
|
|
sp->executable = dlg.executableFile();
|
2009-09-17 14:30:28 +02:00
|
|
|
sp->startMode = StartExternal;
|
2009-06-16 13:44:45 +02:00
|
|
|
if (!dlg.executableArguments().isEmpty())
|
|
|
|
|
sp->processArgs = dlg.executableArguments().split(QLatin1Char(' '));
|
|
|
|
|
|
2009-06-12 12:57:22 +02:00
|
|
|
if (dlg.breakAtMain())
|
|
|
|
|
m_manager->breakByFunctionMain();
|
2009-05-25 16:22:11 +02:00
|
|
|
|
2009-10-08 17:36:07 +02:00
|
|
|
if (RunControl *runControl = m_debuggerRunControlFactory->create(sp, ProjectExplorer::Constants::DEBUGMODE))
|
|
|
|
|
ProjectExplorerPlugin::instance()->startRunControl(runControl, ProjectExplorer::Constants::DEBUGMODE);
|
2009-05-05 17:48:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::attachExternalApplication()
|
|
|
|
|
{
|
2009-05-25 16:22:11 +02:00
|
|
|
AttachExternalDialog dlg(m_manager->mainWindow());
|
|
|
|
|
if (dlg.exec() == QDialog::Accepted)
|
|
|
|
|
attachExternalApplication(dlg.attachPID());
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-26 16:27:24 +02:00
|
|
|
void DebuggerPlugin::attachExternalApplication(qint64 pid, const QString &crashParameter)
|
2009-05-25 16:22:11 +02:00
|
|
|
{
|
|
|
|
|
if (pid == 0) {
|
|
|
|
|
QMessageBox::warning(m_manager->mainWindow(), tr("Warning"), tr("Cannot attach to PID 0"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
2009-09-17 14:30:28 +02:00
|
|
|
const DebuggerStartParametersPtr sp(new DebuggerStartParameters);
|
2009-05-25 16:22:11 +02:00
|
|
|
sp->attachPID = pid;
|
2009-05-26 16:27:24 +02:00
|
|
|
sp->crashParameter = crashParameter;
|
2009-09-23 15:28:50 +02:00
|
|
|
sp->startMode = crashParameter.isEmpty() ? AttachExternal : AttachCrashedExternal;
|
2009-10-08 17:36:07 +02:00
|
|
|
if (RunControl *runControl = m_debuggerRunControlFactory->create(sp, ProjectExplorer::Constants::DEBUGMODE))
|
|
|
|
|
ProjectExplorerPlugin::instance()->startRunControl(runControl, ProjectExplorer::Constants::DEBUGMODE);
|
2009-05-05 17:48:54 +02:00
|
|
|
}
|
|
|
|
|
|
2009-09-30 12:27:03 +02:00
|
|
|
void DebuggerPlugin::attachCmdLineCore()
|
|
|
|
|
{
|
|
|
|
|
m_manager->showStatusMessage(tr("Attaching to core %1.").arg(m_cmdLineAttachCore));
|
|
|
|
|
attachCore(m_cmdLineAttachCore, QString());
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-05 17:48:54 +02:00
|
|
|
void DebuggerPlugin::attachCore()
|
|
|
|
|
{
|
2009-05-25 16:22:11 +02:00
|
|
|
AttachCoreDialog dlg(m_manager->mainWindow());
|
|
|
|
|
dlg.setExecutableFile(
|
|
|
|
|
configValue(_("LastExternalExecutableFile")).toString());
|
|
|
|
|
dlg.setCoreFile(
|
|
|
|
|
configValue(_("LastExternalCoreFile")).toString());
|
|
|
|
|
if (dlg.exec() != QDialog::Accepted)
|
|
|
|
|
return;
|
|
|
|
|
setConfigValue(_("LastExternalExecutableFile"),
|
|
|
|
|
dlg.executableFile());
|
|
|
|
|
setConfigValue(_("LastExternalCoreFile"),
|
|
|
|
|
dlg.coreFile());
|
2009-09-30 12:27:03 +02:00
|
|
|
attachCore(dlg.coreFile(), dlg.executableFile());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DebuggerPlugin::attachCore(const QString &core, const QString &exe)
|
|
|
|
|
{
|
|
|
|
|
const DebuggerStartParametersPtr sp(new DebuggerStartParameters);
|
|
|
|
|
sp->executable = exe;
|
|
|
|
|
sp->coreFile = core;
|
2009-09-17 14:30:28 +02:00
|
|
|
sp->startMode = AttachCore;
|
2009-09-25 11:35:44 +02:00
|
|
|
if (RunControl *runControl = m_debuggerRunControlFactory
|
2009-10-08 17:36:07 +02:00
|
|
|
->create(sp, ProjectExplorer::Constants::DEBUGMODE))
|
|
|
|
|
ProjectExplorerPlugin::instance()->startRunControl(runControl, ProjectExplorer::Constants::DEBUGMODE);
|
2009-05-05 17:48:54 +02:00
|
|
|
}
|
|
|
|
|
|
2009-05-06 13:27:11 +02:00
|
|
|
void DebuggerPlugin::startRemoteApplication()
|
2009-05-05 17:48:54 +02:00
|
|
|
{
|
2009-09-17 14:30:28 +02:00
|
|
|
const DebuggerStartParametersPtr sp(new DebuggerStartParameters);
|
2009-05-25 16:22:11 +02:00
|
|
|
StartRemoteDialog dlg(m_manager->mainWindow());
|
|
|
|
|
QStringList arches;
|
|
|
|
|
arches.append(_("i386:x86-64:intel"));
|
2009-09-24 10:54:27 +02:00
|
|
|
arches.append(_("i386"));
|
2009-05-25 16:22:11 +02:00
|
|
|
dlg.setRemoteArchitectures(arches);
|
|
|
|
|
dlg.setRemoteChannel(
|
|
|
|
|
configValue(_("LastRemoteChannel")).toString());
|
|
|
|
|
dlg.setRemoteArchitecture(
|
|
|
|
|
configValue(_("LastRemoteArchitecture")).toString());
|
|
|
|
|
dlg.setServerStartScript(
|
|
|
|
|
configValue(_("LastServerStartScript")).toString());
|
|
|
|
|
dlg.setUseServerStartScript(
|
|
|
|
|
configValue(_("LastUseServerStartScript")).toBool());
|
2009-10-16 16:16:24 +02:00
|
|
|
dlg.setSysroot(configValue(_("LastSysroot")).toString());
|
2009-05-25 16:22:11 +02:00
|
|
|
if (dlg.exec() != QDialog::Accepted)
|
|
|
|
|
return;
|
|
|
|
|
setConfigValue(_("LastRemoteChannel"), dlg.remoteChannel());
|
|
|
|
|
setConfigValue(_("LastRemoteArchitecture"), dlg.remoteArchitecture());
|
|
|
|
|
setConfigValue(_("LastServerStartScript"), dlg.serverStartScript());
|
|
|
|
|
setConfigValue(_("LastUseServerStartScript"), dlg.useServerStartScript());
|
2009-10-16 16:16:24 +02:00
|
|
|
setConfigValue(_("LastSysroot"), dlg.sysroot());
|
2009-05-25 16:22:11 +02:00
|
|
|
sp->remoteChannel = dlg.remoteChannel();
|
|
|
|
|
sp->remoteArchitecture = dlg.remoteArchitecture();
|
2009-09-17 14:30:28 +02:00
|
|
|
sp->startMode = StartRemote;
|
2009-05-25 16:22:11 +02:00
|
|
|
if (dlg.useServerStartScript())
|
|
|
|
|
sp->serverStartScript = dlg.serverStartScript();
|
2009-10-16 16:16:24 +02:00
|
|
|
sp->sysRoot = dlg.sysroot();
|
2009-05-25 16:22:11 +02:00
|
|
|
|
2009-10-08 17:36:07 +02:00
|
|
|
if (RunControl *runControl = m_debuggerRunControlFactory->create(sp, ProjectExplorer::Constants::DEBUGMODE))
|
|
|
|
|
ProjectExplorerPlugin::instance()->startRunControl(runControl, ProjectExplorer::Constants::DEBUGMODE);
|
2009-05-05 17:48:54 +02:00
|
|
|
}
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "debuggerplugin.moc"
|
|
|
|
|
|
|
|
|
|
Q_EXPORT_PLUGIN(DebuggerPlugin)
|