From 40f0d4d7c32e398b29f08266e79ea4d9cdcd730f Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Wed, 3 Feb 2010 16:50:28 +0100
Subject: [PATCH] Debuggers: Enable Python-dumpers for Windows-built gdb.

Engine: Introduce convention of setting the PYTHONPATH
variable to <path-to-gdb>\python2.5 for WIndows.

Dumpers: Import 'curses' depending on platform, fix Syntax
for 2.5, catch file lock errors by os.remove.
Reviewed-by: hjk
---
 share/qtcreator/gdbmacros/dumper.py      | 19 +++++++++++++------
 src/plugins/debugger/debuggeractions.cpp |  6 +++++-
 src/plugins/debugger/gdb/gdbengine.cpp   | 24 ++++++++++++++++++++++++
 src/plugins/debugger/gdb/trkgdbadapter.h |  1 -
 src/plugins/debugger/gdb/trkoptions.cpp  |  4 ++--
 5 files changed, 44 insertions(+), 10 deletions(-)

diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py
index d70932a5563..c7836431a27 100644
--- a/share/qtcreator/gdbmacros/dumper.py
+++ b/share/qtcreator/gdbmacros/dumper.py
@@ -7,7 +7,10 @@ import sys
 import traceback
 import gdb
 import base64
-import curses.ascii
+import os
+
+if os.name != "nt":
+    import curses.ascii
 
 # only needed for gdb 7.0/7.0.1 that do not implement parse_and_eval
 import os
@@ -40,7 +43,7 @@ def cleanAddress(addr):
 def numericTemplateArgument(type, position):
     try:
         return int(type.template_argument(position))
-    except RuntimeError as error:
+    except RuntimeError, error:
         # ": No type named 30."
         msg = str(error)
         return int(msg[14:-1])
@@ -103,8 +106,10 @@ def listOfBreakpoints(d):
             continue
         lines.append(line)
     file.close()
-    os.remove(filename)
-
+    try:  # files may still be locked by gdb on Windows
+        os.remove(filename)
+    except:
+        pass
     lines.reverse()
     bp = Breakpoint()
     for line in lines:
@@ -254,8 +259,10 @@ def listOfLocals(varList):
                 continue
             varList.append(line[0:pos])
         file.close()
-        os.remove(filename)
-
+        try:  # files may still be locked by gdb on Windows
+            os.remove(filename)
+        except:
+            pass
         #warn("VARLIST: %s " % varList)
         for name in varList:
             #warn("NAME %s " % name)
diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp
index 2f05b16231b..b5d01f00d88 100644
--- a/src/plugins/debugger/debuggeractions.cpp
+++ b/src/plugins/debugger/debuggeractions.cpp
@@ -284,7 +284,11 @@ DebuggerSettings *DebuggerSettings::instance()
     //
     item = new SavedAction(instance);
     item->setSettingsKey(debugModeGroup, QLatin1String("Location"));
-    item->setDefaultValue("gdb");
+#ifdef Q_OS_WIN
+    item->setDefaultValue(QLatin1String("gdb-i686-pc-mingw32.exe"));
+#else
+    item->setDefaultValue(QLatin1String("gdb"));
+#endif
     instance->insertItem(GdbLocation, item);
 
     item = new SavedAction(instance);
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 1f790572509..3d7f6343f08 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -96,6 +96,8 @@ namespace Internal {
 
 //#define DEBUG_PENDING  1
 
+static const char winPythonVersionC[] = "python2.5";
+
 #if DEBUG_PENDING
 #   define PENDING_DEBUG(s) qDebug() << s
 #else
@@ -3740,6 +3742,28 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &gdb, const QStr
     gdbArgs << _("-i");
     gdbArgs << _("mi");
     gdbArgs += args;
+#ifdef Q_OS_WIN
+    // Set python path. By convention, python is located below gdb executable
+    const QFileInfo fi(location);
+    if (fi.isAbsolute()) {
+        const QString winPythonVersion = QLatin1String(winPythonVersionC);
+        const QDir dir = fi.absoluteDir();
+        if (dir.exists(winPythonVersion)) {
+            QProcessEnvironment environment = QProcessEnvironment::systemEnvironment();
+            const QString pythonPathVariable = QLatin1String("PYTHONPATH");
+            // Check for existing values.
+            if (environment.contains(pythonPathVariable)) {
+                const QString oldPythonPath = environment.value(pythonPathVariable);
+                manager()->showDebuggerOutput(LogMisc, QString::fromLatin1("Using existing python path: %1").arg(oldPythonPath));
+            } else {
+                const QString pythonPath = QDir::toNativeSeparators(dir.absoluteFilePath(winPythonVersion));
+                environment.insert(pythonPathVariable, pythonPath);
+                manager()->showDebuggerOutput(LogMisc, QString::fromLatin1("Python path: %1").arg(pythonPath));
+                m_gdbProc.setProcessEnvironment(environment);
+            }
+        }
+    }
+#endif
     m_gdbProc.start(location, gdbArgs);
 
     if (!m_gdbProc.waitForStarted()) {
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h
index 84756dc388f..0c5a4af7206 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.h
+++ b/src/plugins/debugger/gdb/trkgdbadapter.h
@@ -40,7 +40,6 @@
 #include <QtCore/QHash>
 #include <QtCore/QPointer>
 #include <QtCore/QSharedPointer>
-#include <QtCore/QProcess>
 #include <QtCore/QQueue>
 #include <QtCore/QString>
 #include <QtCore/QStringList>
diff --git a/src/plugins/debugger/gdb/trkoptions.cpp b/src/plugins/debugger/gdb/trkoptions.cpp
index d67204615c9..8a31923b6fc 100644
--- a/src/plugins/debugger/gdb/trkoptions.cpp
+++ b/src/plugins/debugger/gdb/trkoptions.cpp
@@ -39,13 +39,13 @@
 enum { firstSerialPort = 1, lastSerialPort = 12 };
 enum { modeDefault = Debugger::Internal::TrkOptions::Serial };
 static const char *serialPortDefaultC = SERIALPORT_ROOT"1";
-static const char *gdbDefaultC = "symgdb";
+static const char *gdbDefaultC = "gdb-arm-none-symbianelf.exe";
 #else
 #    define SERIALPORT_ROOT "/dev/ttyS"
 enum { firstSerialPort = 0, lastSerialPort = 3 };
 enum { modeDefault = Debugger::Internal::TrkOptions::BlueTooth };
 static const char *serialPortDefaultC = SERIALPORT_ROOT"0";
-static const char *gdbDefaultC = "symgdb";
+static const char *gdbDefaultC = "gdb-arm-none-symbianelf";
 #endif
 
 static const char *settingsGroupC = "S60Debugger";
-- 
GitLab