diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 659ec059c853a20fa333967aa095689f67e25cfd..ea90ff9f155df533787b803373b413ad38df41b9 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -128,6 +128,7 @@
 #include <QtCore/QTimer>
 #include <QtCore/QVariant>
 #include <QtCore/QtPlugin>
+#include <QtCore/QScopedPointer>
 
 #include <QtGui/QAbstractItemView>
 #include <QtGui/QAction>
@@ -958,7 +959,6 @@ public slots:
     void updateState(DebuggerEngine *engine);
     void onCurrentProjectChanged(ProjectExplorer::Project *project);
 
-    void resetLocation();
     void gotoLocation(const QString &file, int line, bool setMarker);
 
     void clearStatusMessage();
@@ -969,6 +969,7 @@ public slots:
 
     void executeDebuggerCommand();
     void scriptExpressionEntered(const QString &expression);
+    void coreShutdown();
 
 public:
     DebuggerState m_state;
@@ -978,7 +979,7 @@ public:
     DebuggerRunControlFactory *m_debuggerRunControlFactory;
 
     QString m_previousMode;
-    TextEditor::BaseTextMark *m_locationMark;
+    QScopedPointer<TextEditor::BaseTextMark> m_locationMark;
     Core::Context m_continuableContext;
     Core::Context m_interruptibleContext;
     Core::Context m_undisturbableContext;
@@ -1043,9 +1044,11 @@ public:
     DebuggerPlugin *m_plugin;
 
     SnapshotHandler *m_snapshotHandler;
+    bool m_shuttingDown;
 };
 
-DebuggerPluginPrivate::DebuggerPluginPrivate(DebuggerPlugin *plugin)
+DebuggerPluginPrivate::DebuggerPluginPrivate(DebuggerPlugin *plugin) :
+    m_shuttingDown(false)
 {
     m_plugin = plugin;
 
@@ -1078,7 +1081,6 @@ DebuggerPluginPrivate::DebuggerPluginPrivate(DebuggerPlugin *plugin)
 
     m_sessionEngine = 0;
     m_debugMode = 0;
-    m_locationMark = 0;
 
     m_continuableContext = Core::Context(0);
     m_interruptibleContext = Core::Context(0);
@@ -1106,6 +1108,7 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, QString *er
     // FIXME: Move part of this to extensionsInitialized()?
     ICore *core = ICore::instance();
     QTC_ASSERT(core, return false);
+    connect(core, SIGNAL(coreAboutToClose()), this, SLOT(coreShutdown()));
 
     Core::ActionManager *am = core->actionManager();
     QTC_ASSERT(am, return false);
@@ -1609,8 +1612,6 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, QString *er
         m_plugin->addAutoReleasedObject(op);
     m_plugin->addAutoReleasedObject(new DebuggingHelperOptionPage);
 
-    m_locationMark = 0;
-
     //setSimpleDockWidgetArrangement(Lang_Cpp);
 
     connect(ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)),
@@ -2133,7 +2134,7 @@ void DebuggerPluginPrivate::fontSettingsChanged
 
 void DebuggerPluginPrivate::cleanupViews()
 {
-    resetLocation();
+    m_plugin->resetLocation();
     m_actions.reverseDirectionAction->setChecked(false);
     m_actions.reverseDirectionAction->setEnabled(false);
     hideDebuggerToolTip();
@@ -2411,14 +2412,12 @@ void DebuggerPluginPrivate::updateState(DebuggerEngine *engine)
     m_scriptConsoleWindow->setEnabled(stopped);
 }
 
-void DebuggerPluginPrivate::resetLocation()
-{
-    delete m_locationMark;
-    m_locationMark = 0;
-}
-
 void DebuggerPluginPrivate::gotoLocation(const QString &file, int line, bool setMarker)
 {
+    // CDB might hit on breakpoints while shutting down.
+    if (m_shuttingDown)
+        return;
+
     bool newEditor = false;
     ITextEditor *editor =
         BaseTextEditor::openEditorAt(file, line, 0, QString(),
@@ -2427,10 +2426,8 @@ void DebuggerPluginPrivate::gotoLocation(const QString &file, int line, bool set
         return;
     if (newEditor)
         editor->setProperty("OpenedByDebugger", true);
-    if (setMarker) {
-        resetLocation();
-        m_locationMark = new LocationMark(file, line);
-    }
+    if (setMarker)
+        m_locationMark.reset(new LocationMark(file, line));
 }
 
 void DebuggerPluginPrivate::onModeChanged(IMode *mode)
@@ -2554,6 +2551,10 @@ void DebuggerPluginPrivate::openMemoryEditor()
         QModelIndex(), dialog.address(), RequestShowMemoryRole);
 }
 
+void DebuggerPluginPrivate::coreShutdown()
+{
+    m_shuttingDown = true;
+}
 
 ///////////////////////////////////////////////////////////////////////
 //
@@ -2587,9 +2588,6 @@ DebuggerPlugin::~DebuggerPlugin()
     delete d->m_debugMode;
     d->m_debugMode = 0;
 
-    delete d->m_locationMark;
-    d->m_locationMark = 0;
-
     removeObject(d->m_uiSwitcher);
     delete d->m_uiSwitcher;
     d->m_uiSwitcher = 0;
@@ -2636,34 +2634,19 @@ QVariant DebuggerPlugin::configValue(const QString &name) const
 
 void DebuggerPlugin::resetLocation()
 {
-    d->resetLocation();
-    //qDebug() << "RESET_LOCATION: current:"  << currentTextEditor();
-    //qDebug() << "RESET_LOCATION: locations:"  << m_locationMark;
-    //qDebug() << "RESET_LOCATION: stored:"  << m_locationMark->editor();
-    delete d->m_locationMark;
-    d->m_locationMark = 0;
+    d->m_locationMark.reset();
 }
 
 void DebuggerPlugin::gotoLocation(const QString &file, int line, bool setMarker)
 {
-    bool newEditor = false;
-    ITextEditor *editor =
-        BaseTextEditor::openEditorAt(file, line, 0, QString(),
-            EditorManager::IgnoreNavigationHistory,
-            &newEditor);
-    if (!editor)
-        return;
-    if (newEditor)
-        editor->setProperty("OpenedByDebugger", true);
-    if (setMarker) {
-        resetLocation();
-        d->m_locationMark = new LocationMark(file, line);
-    }
+    d->gotoLocation(file, line, setMarker);
 }
 
 void DebuggerPlugin::openTextEditor(const QString &titlePattern0,
     const QString &contents)
 {
+    if (d->m_shuttingDown)
+        return;
     QString titlePattern = titlePattern0;
     EditorManager *editorManager = EditorManager::instance();
     QTC_ASSERT(editorManager, return);