Commit e3f748b5 authored by dt's avatar dt
Browse files

Merge branch 'master' of git@scm.dev.nokia.troll.no:creator/mainline

parents f25638f7 f867061d
......@@ -561,7 +561,7 @@ void DebuggerManager::notifyInferiorUpdateFinished()
void DebuggerManager::notifyInferiorRunningRequested()
{
setStatus(DebuggerInferiorRunningRequested);
showStatusMessage(tr("Running..."), 5000);
showStatusMessage(tr("Running requested..."), 5000);
}
void DebuggerManager::notifyInferiorRunning()
......@@ -579,7 +579,7 @@ void DebuggerManager::notifyInferiorExited()
void DebuggerManager::notifyInferiorPidChanged(int pid)
{
//QMessageBox::warning(0, "PID", "PID: " + QString::number(pid));
//qDebug() << "PID: " << pid;
qDebug() << "PID: " << pid;
emit inferiorPidChanged(pid);
}
......@@ -1082,22 +1082,12 @@ bool DebuggerManager::useCustomDumpers() const
return m_settings.m_useCustomDumpers;
}
bool DebuggerManager::useFastStart() const
{
return 0; // && m_settings.m_useFastStart;
}
void DebuggerManager::setUseCustomDumpers(bool on)
{
m_settings.m_useCustomDumpers = on;
engine()->setUseCustomDumpers(on);
}
void DebuggerManager::setUseFastStart(bool on)
{
m_settings.m_useFastStart = on;
}
void DebuggerManager::setDebugDumpers(bool on)
{
m_settings.m_debugDumpers = on;
......
......@@ -170,7 +170,11 @@ private:
virtual bool skipKnownFrames() const = 0;
virtual bool debugDumpers() const = 0;
virtual bool useCustomDumpers() const = 0;
virtual bool useFastStart() const = 0;
virtual bool wantsAllPluginBreakpoints() const = 0;
virtual bool wantsSelectedPluginBreakpoints() const = 0;
virtual bool wantsNoPluginBreakpoints() const = 0;
virtual QString selectedPluginBreakpointsPattern() const = 0;
virtual void reloadDisassembler() = 0;
virtual void reloadModules() = 0;
......@@ -288,7 +292,6 @@ public slots:
void setUseCustomDumpers(bool on);
void setDebugDumpers(bool on);
void setSkipKnownFrames(bool on);
void setUseFastStart(bool on);
private slots:
void showDebuggerOutput(const QString &prefix, const QString &msg);
......@@ -323,7 +326,14 @@ private:
bool skipKnownFrames() const;
bool debugDumpers() const;
bool useCustomDumpers() const;
bool useFastStart() const;
bool wantsAllPluginBreakpoints() const
{ return m_settings.m_pluginAllBreakpoints; }
bool wantsSelectedPluginBreakpoints() const
{ return m_settings.m_pluginSelectedBreakpoints; }
bool wantsNoPluginBreakpoints() const
{ return m_settings.m_pluginNoBreakpoints; }
QString selectedPluginBreakpointsPattern() const
{ return m_settings.m_pluginSelectedBreakpointsPattern; }
void notifyStartupFinished();
void notifyInferiorStopped();
......
......@@ -281,6 +281,8 @@ QWidget *GdbOptionPage::createPage(QWidget *parent)
setChecked(m_settings.m_pluginSelectedBreakpoints);
m_ui.radioButtonNoPluginBreakpoints->
setChecked(m_settings.m_pluginNoBreakpoints);
m_ui.lineEditSelectedPluginBreakpointsPattern->
setText(m_settings.m_pluginSelectedBreakpointsPattern);
m_ui.lineEditSelectedPluginBreakpointsPattern->
setEnabled(m_settings.m_pluginSelectedBreakpoints);
......@@ -335,7 +337,6 @@ void GdbOptionPage::apply()
m_settings.m_pluginSelectedBreakpointsPattern =
m_ui.lineEditSelectedPluginBreakpointsPattern->text();
*m_plugin->m_manager->settings() = m_settings;
m_plugin->writeSettings();
}
......
......@@ -99,10 +99,8 @@ enum GdbCommandType
GdbQueryPwd,
GdbQuerySources,
GdbAsyncOutput2,
GdbStart,
GdbExecRun,
GdbExecStart1,
GdbExecStart2,
GdbExecStart3,
GdbExecRunToFunction,
GdbExecStep,
GdbExecNext,
......@@ -254,7 +252,6 @@ void GdbEngine::init()
{
m_pendingRequests = 0;
m_gdbVersion = 100;
m_shared = 0;
m_outputCodec = QTextCodec::codecForLocale();
m_dataDumperState = DataDumperUninitialized;
......@@ -461,13 +458,28 @@ void GdbEngine::handleResponse()
break;
}
case '~':
case '@':
case '~': {
QString data = GdbMi::parseCString(from, to);
m_pendingConsoleStreamOutput += data;
m_inbuffer = QByteArray(from, to - from);
break;
}
case '@': {
QString data = GdbMi::parseCString(from, to);
m_pendingTargetStreamOutput += data;
m_inbuffer = QByteArray(from, to - from);
break;
}
case '&': {
QString data = GdbMi::parseCString(from, to);
handleStreamOutput(data, c);
//dump(oldfrom, from, record.toString());
m_pendingLogStreamOutput += data;
m_inbuffer = QByteArray(from, to - from);
// On Windows, the contents seem to depend on the debugger
// version and/or OS version used.
if (data.startsWith("warning:"))
qq->showApplicationOutput(data);
break;
}
......@@ -760,14 +772,8 @@ void GdbEngine::handleResult(const GdbResultRecord & record, int type,
handleExecRun(record);
break;
case GdbExecStart1:
handleExecStart1(record);
break;
case GdbExecStart2:
//handleExecStart2(record);
break;
case GdbExecStart3:
handleExecStart3(record);
case GdbStart:
handleStart(record);
break;
case GdbInfoProc:
handleInfoProc(record);
......@@ -988,18 +994,6 @@ void GdbEngine::handleInfoShared(const GdbResultRecord &record)
if (record.resultClass == GdbResultDone) {
// let the modules handler do the parsing
handleModulesList(record);
QList<Module> modules = qq->modulesHandler()->modules();
bool reloadNeeded = false;
foreach (const Module &module, modules) {
// FIXME: read this from some list
if (!module.symbolsRead && !module.moduleName.contains("Q")) {
reloadNeeded = true;
sendCommand("sharedlibrary " + dotEscape(module.moduleName));
}
}
if (reloadNeeded)
reloadModules();
continueInferior();
}
}
......@@ -1041,84 +1035,6 @@ void GdbEngine::handleExecRunToFunction(const GdbResultRecord &record)
q->gotoLocation(file, line, true);
}
void GdbEngine::handleStreamOutput(const QString &data, char code)
{
// Linux
if (data.contains("[New Thread")) {
QRegExp re("\\[New Thread 0x([0-9a-f]*) \\(LWP ([0-9]*)\\)\\]");
if (re.indexIn(data) != -1)
maybeHandleInferiorPidChanged(re.cap(2));
}
// Mac
if (data.contains("[Switching to process ")) {
QRegExp re("\\[Switching to process ([0-9]*) local thread 0x([0-9a-f]*)\\]");
if (re.indexIn(data) != -1)
maybeHandleInferiorPidChanged(re.cap(1));
}
// present it twice: now and together with the next 'real' result
switch (code) {
case '~':
m_pendingConsoleStreamOutput += data;
break;
case '@':
m_pendingTargetStreamOutput += data;
break;
case '&':
m_pendingLogStreamOutput += data;
// On Windows, the contents seem to depend on the debugger
// version and/or OS version used.
if (data.startsWith("warning:"))
qq->showApplicationOutput(data);
break;
}
#ifdef Q_OS_LINUX
if (data.startsWith("Pending break") && data.contains("\" resolved")) {
qDebug() << "SCHEDULING -break-list";
//m_breakListOnStopNeeded = true;
}
#endif
#if 0
if (m_slurpingPTypeOutput)
qDebug() << "SLURP: " << output.data;
// "No symbol \"__dlopen\" in current context."
// "No symbol \"dlopen\" in current context."
if (output.data.startsWith("No symbol ")
&& output.data.contains("dlopen")) {
m_dlopened = true;
return;
}
// output of 'ptype <foo>'
if (output.data.startsWith("type = ")) {
if (output.data.endsWith("{") || output.data.endsWith("{\\n")) {
// multi-line output started here...
m_slurpingPTypeOutput = true;
m_slurpedPTypeOutput = output.data;
} else {
// Happens for simple types. Process it immediately
m_watchHandler->handleTypeContents(output.data);
}
return;
}
if (m_slurpingPTypeOutput) {
m_slurpedPTypeOutput += '\n';
m_slurpedPTypeOutput += output.data;
if (output.data.startsWith("}")) {
// this is the last line...
m_slurpingPTypeOutput = false;
m_watchHandler->handleTypeContents(m_slurpedPTypeOutput);
m_slurpedPTypeOutput.clear();
}
return;
}
#endif
}
static bool isExitedReason(const QString &reason)
{
return reason == QLatin1String("exited-normally") // inferior exited normally
......@@ -1146,7 +1062,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
{
const QString reason = data.findChild("reason").data();
QString console = data.findChild("consolestreamoutput").data();
QString msg = data.findChild("consolestreamoutput").data();
if (reason.isEmpty()) {
GdbMi frame = data.findChild("frame");
if (frame.findChild("func").data() == "_start") {
......@@ -1162,11 +1078,27 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
sendCommand("info pid", GdbInfoProc, QVariant(), true);
#endif
sendCommand("-file-list-exec-source-files", GdbQuerySources);
sendCommand("set auto-solib-add on");
sendCommand("sharedlibrary libc"); // for malloc
sendCommand("sharedlibrary libdl"); // for dlopen
tryLoadCustomDumpers();
sendCommand("info shared", ModulesList, QVariant());
// intentionally after tryLoadCustomDumpers(),
// otherwise we'd interupt solib loading.
if (qq->wantsAllPluginBreakpoints()) {
sendCommand("set auto-solib-add on");
sendCommand("set stop-on-solib-events 0");
sendCommand("sharedlibrary .*");
} else if (qq->wantsSelectedPluginBreakpoints()) {
sendCommand("set auto-solib-add on");
sendCommand("set stop-on-solib-events 1");
sendCommand("sharedlibrary "+qq->selectedPluginBreakpointsPattern());
} else if (qq->wantsNoPluginBreakpoints()) {
// should be like that already
sendCommand("set auto-solib-add off");
sendCommand("set stop-on-solib-events 0");
}
reloadModules();
// this will "continue" if done
attemptBreakpointSynchronization();
return;
......@@ -1174,36 +1106,19 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
// fall through
}
#if 0
if (console.contains("Stopped due to shared library event") || reason.isEmpty()) {
++m_shared;
//if (m_shared == 2)
// tryLoadCustomDumpers();
//qDebug() << "SHARED LIBRARY EVENT " << data.toString() << m_shared;
if (qq->useFastStart()) {
if (1 || m_shared <= 16) { // libpthread?
sendCommand("info shared", GdbInfoShared);
//sendCommand("sharedlibrary gdbdebugger ");
//continueInferior();
} else {
// auto-load from now on
sendCommand("info shared");
sendCommand("set auto-solib-add on");
sendCommand("-file-list-exec-source-files", GdbQuerySources);
sendCommand("-break-list", BreakList);
//sendCommand("bt");
//QVariant var = QVariant::fromValue<GdbMi>(data);
//sendCommand("p 1", GdbAsyncOutput2, var); // dummy
continueInferior();
}
} else {
// slow start requested.
q->showStatusMessage(tr("Loading %1...").arg(QString(data.toString())));
static bool modulesDirty = false;
if (msg.contains("Stopped due to shared library event") || reason.isEmpty()) {
if (qq->wantsSelectedPluginBreakpoints()) {
qDebug() << "SHARED LIBRARY EVENT " << data.toString();
qDebug() << "PATTERN" << qq->selectedPluginBreakpointsPattern();
sendCommand("sharedlibrary " + qq->selectedPluginBreakpointsPattern());
continueInferior();
q->showStatusMessage(tr("Loading %1...").arg(QString(data.toString())));
return;
}
return;
modulesDirty = true;
// fall through
}
#endif
if (isExitedReason(reason)) {
qq->notifyInferiorExited();
......@@ -1256,11 +1171,17 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
}
if (isStoppedReason(reason) || reason.isEmpty()) {
if (modulesDirty) {
sendCommand("-file-list-exec-source-files", GdbQuerySources);
sendCommand("-break-list", BreakList);
reloadModules();
modulesDirty = false;
}
// Need another round trip
if (reason == "breakpoint-hit") {
q->showStatusMessage(tr("Stopped at breakpoint"));
GdbMi frame = data.findChild("frame");
qDebug() << "HIT BREAKPOINT: " << frame.toString();
//qDebug() << "HIT BREAKPOINT: " << frame.toString();
m_currentFrame = frame.findChild("addr").data() + '%' +
frame.findChild("func").data() + '%';
......@@ -1504,7 +1425,6 @@ void GdbEngine::exitDebugger()
m_fullToShortName.clear();
m_varToType.clear();
m_dataDumperState = DataDumperUninitialized;
m_shared = 0;
m_outputCollector.shutdown();
//q->settings()->m_debugDumpers = false;
}
......@@ -1572,12 +1492,7 @@ bool GdbEngine::startDebugger()
q->showStatusMessage(tr("Gdb Running"));
sendCommand("show version", GdbShowVersion);
if (qq->useFastStart()) {
sendCommand("set auto-solib-add off");
sendCommand("set stop-on-solib-events 1");
}
//sendCommand("-enable-timings");
//sendCommand("set stop-on-solib-events 1");
sendCommand("set print static-members off"); // Seemingly doesn't work.
//sendCommand("define hook-stop\n-thread-list-ids\n-stack-list-frames\nend");
//sendCommand("define hook-stop\nprint 4\nend");
......@@ -1647,13 +1562,17 @@ bool GdbEngine::startDebugger()
}
if (q->startMode() == q->startInternal) {
emit gdbInputAvailable(QString(), QString());
sendCommand("-file-exec-and-symbols " + fileName, GdbFileExecAndSymbols);
//sendCommand("file " + fileName, GdbFileExecAndSymbols);
#ifdef Q_OS_MAC
sendCommand("sharedlibrary apply-load-rules all");
#endif
//sendCommand("-gdb-set stop-on-solib-events 1");
runInferior();
setTokenBarrier();
if (!q->m_processArgs.isEmpty())
sendCommand("-exec-arguments " + q->m_processArgs.join(" "));
sendCommand("set auto-solib-add off");
sendCommand("x/2i _start", GdbStart);
}
if (q->startMode() == q->attachExternal) {
......@@ -1692,21 +1611,7 @@ void GdbEngine::continueInferior()
sendCommand("-exec-continue", GdbExecContinue);
}
void GdbEngine::runInferior()
{
q->resetLocation();
// FIXME: this ignores important startup messages
setTokenBarrier();
if (!q->m_processArgs.isEmpty())
sendCommand("-exec-arguments " + q->m_processArgs.join(" "));
qq->notifyInferiorRunningRequested();
emit gdbInputAvailable(QString(), QString());
sendCommand("set auto-solib-add off");
sendCommand("x/2i _start", GdbExecStart1);
}
void GdbEngine::handleExecStart1(const GdbResultRecord &response)
void GdbEngine::handleStart(const GdbResultRecord &response)
{
if (response.resultClass == GdbResultDone) {
// stdout:&"x/2i _start\n"
......@@ -1716,8 +1621,9 @@ void GdbEngine::handleExecStart1(const GdbResultRecord &response)
QRegExp needle("0x([0-9a-f]+) <_start\\+.*>:");
if (needle.indexIn(msg) != -1) {
//qDebug() << "STREAM: " << msg << needle.cap(1);
sendCommand("tbreak *0x" + needle.cap(1)); // GdbExecStart3);
sendCommand("-exec-run"); // GdbExecStart3);
sendCommand("tbreak *0x" + needle.cap(1));
sendCommand("-exec-run");
qq->notifyInferiorRunningRequested();
} else {
qDebug() << "PARSING START ADDRESS FAILED" << msg;
}
......@@ -1726,20 +1632,6 @@ void GdbEngine::handleExecStart1(const GdbResultRecord &response)
}
}
void GdbEngine::handleExecStart3(const GdbResultRecord &)
{
#if defined(Q_OS_WIN)
sendCommand("info proc", GdbInfoProc);
#endif
#if defined(Q_OS_LINUX)
sendCommand("info proc", GdbInfoProc);
#endif
#if defined(Q_OS_MAC)
sendCommand("info pid", GdbInfoProc, QVariant(), true);
#endif
attemptBreakpointSynchronization();
}
void GdbEngine::stepExec()
{
setTokenBarrier();
......@@ -2258,12 +2150,7 @@ void GdbEngine::attemptBreakpointSynchronization()
}
}
if (updateNeeded) {
//interruptAndContinue();
//sendListBreakpoints();
}
if (!updateNeeded && q->status() == DebuggerProcessStartingUp) {
if (!updateNeeded) {
// we continue the execution
continueInferior();
}
......@@ -4031,7 +3918,6 @@ void GdbEngine::assignValueInDebugger(const QString &expression, const QString &
sendCommand("-var-assign assign " + value, WatchVarAssign);
}
void GdbEngine::tryLoadCustomDumpers()
{
if (m_dataDumperState != DataDumperUninitialized)
......@@ -4044,8 +3930,6 @@ void GdbEngine::tryLoadCustomDumpers()
QString lib = q->m_buildDir + "/qtc-gdbmacros/libgdbmacros.so";
if (QFileInfo(lib).isExecutable()) {
//sendCommand("p dlopen");
//if (qq->useFastStart())
// sendCommand("set stop-on-solib-events 0");
QString flag = QString::number(RTLD_NOW);
sendSynchronizedCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")",
WatchDumpCustomSetup);
......@@ -4053,8 +3937,6 @@ void GdbEngine::tryLoadCustomDumpers()
sendSynchronizedCommand("call (void)__dlopen(\"" + lib + "\", " + flag + ")",
WatchDumpCustomSetup);
sendSynchronizedCommand("sharedlibrary " + dotEscape(lib));
//if (qq->useFastStart())
// sendCommand("set stop-on-solib-events 1");
} else {
qDebug() << "DEBUG HELPER LIBRARY IS NOT USABLE: "
<< lib << QFileInfo(lib).isExecutable();
......@@ -4064,14 +3946,10 @@ void GdbEngine::tryLoadCustomDumpers()
QString lib = q->m_buildDir + "/qtc-gdbmacros/libgdbmacros.dylib";
if (QFileInfo(lib).isExecutable()) {
//sendCommand("p dlopen"); // FIXME: remove me
//if (qq->useFastStart())
// sendCommand("set stop-on-solib-events 0");
QString flag = QString::number(RTLD_NOW);
sendSynchronizedCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")",
WatchDumpCustomSetup);
sendSynchronizedCommand("sharedlibrary " + dotEscape(lib));
//if (qq->useFastStart())
// sendCommand("set stop-on-solib-events 1");
} else {
qDebug() << "DEBUG HELPER LIBRARY IS NOT USABLE: "
<< lib << QFileInfo(lib).isExecutable();
......@@ -4080,15 +3958,11 @@ void GdbEngine::tryLoadCustomDumpers()
#if defined(Q_OS_WIN)
QString lib = q->m_buildDir + "/qtc-gdbmacros/debug/gdbmacros.dll";
if (QFileInfo(lib).exists()) {
//if (qq->useFastStart())
// sendCommand("set stop-on-solib-events 0");
//sendCommand("handle SIGSEGV pass stop print");
//sendCommand("set unwindonsignal off");
sendSynchronizedCommand("call LoadLibraryA(\"" + lib + "\")",
WatchDumpCustomSetup);
sendSynchronizedCommand("sharedlibrary " + dotEscape(lib));
//if (qq->useFastStart())
// sendCommand("set stop-on-solib-events 1");
} else {
qDebug() << "DEBUG HELPER LIBRARY IS NOT USABLE: "
<< lib << QFileInfo(lib).isExecutable();
......
......@@ -113,7 +113,6 @@ private:
void exitDebugger();
void continueInferior();
void runInferior();
void interruptInferior();
void runToLineExec(const QString &fileName, int lineNumber);
......@@ -179,14 +178,12 @@ private slots:
private:
int terminationIndex(const QByteArray &buffer, int &length);
void handleStreamOutput(const QString &output, char code);
void handleStart(const GdbResultRecord &response);
void handleAsyncOutput2(const GdbMi &data);
void handleAsyncOutput(const GdbMi &data);
void handleResultRecord(const GdbResultRecord &response);
void handleFileExecAndSymbols(const GdbResultRecord &response);
void handleExecRun(const GdbResultRecord &response);
void handleExecStart1(const GdbResultRecord &response);
void handleExecStart3(const GdbResultRecord &response);
void handleExecJumpToLine(const GdbResultRecord &response);
void handleExecRunToFunction(const GdbResultRecord &response);
void handleInfoShared(const GdbResultRecord &response);
......@@ -217,7 +214,6 @@ private:
int m_oldestAcceptableToken;
int m_gdbVersion; // 6.8.0 is 680
int m_shared;
// awful hack to keep track of used files
QHash<QString, QString> m_shortToFullName;
......
......@@ -19,7 +19,7 @@
<property name="title">
<string>Locations</string>
</property>
<layout class="QGridLayout">
<layout class="QGridLayout" name="gridLayout_3">
<property name="margin">
<number>9</number>
</property>
......
......@@ -62,7 +62,6 @@ public:
virtual void nextIExec() = 0;
virtual void continueInferior() = 0;
virtual void runInferior() = 0;
virtual void interruptInferior() = 0;
virtual void runToLineExec(const QString &fileName, int lineNumber) = 0;
......
......@@ -170,16 +170,24 @@ bool MinGWToolChain::equals(ToolChain *other) const
void MinGWToolChain::addToEnvironment(ProjectExplorer::Environment &env)
{
//qDebug()<<"MinGWToolChain::addToEnvironment";
QString binDir = m_mingwPath + "/bin";
if (QFileInfo(binDir).exists())
env.prependOrSetPath(binDir);
// if (QFileInfo(binDir).exists())
// qDebug()<<"Adding "<<binDir<<" to the PATH";
}
MSVCToolChain::MSVCToolChain(const QString &name)
: m_name(name), m_valuesSet(false)
{
if (m_name.isEmpty()) { // Could be because system qt doesn't set this
QSettings registry("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VS7",
QSettings::NativeFormat);
if (registry.allKeys().count())
m_name = registry.allKeys().first();
}
}
ToolChain::ToolChainType MSVCToolChain::type() const
......@@ -211,10 +219,11 @@ QList<HeaderPath> MSVCToolChain::systemHeaderPaths()
//TODO fix this code
ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
addToEnvironment(env);
#ifdef QTCREATOR_WITH_MSVC_INCLUDES
return env.value("INCLUDE").split(QLatin1Char(';'));