diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 47f0810a9dbb50e84a88eea4f600ca313908f648..b9863631e5290fdb9f6c6ad740279234792d4058 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -4015,8 +4015,7 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &gdb, const QStr
     gdbProc()->start(m_gdb, gdbArgs);
 
     if (!gdbProc()->waitForStarted()) {
-        const QString msg = tr("Unable to start gdb '%1': %2")
-            .arg(m_gdb, gdbProc()->errorString());
+        const QString msg = errorMessage(QProcess::FailedToStart);
         handleAdapterStartFailed(msg, settingsIdHint);
         return false;
     }
@@ -4129,19 +4128,23 @@ bool GdbEngine::checkDebuggingHelpers()
 
 void GdbEngine::handleGdbError(QProcess::ProcessError error)
 {
-    showMessage(_("HANDLE GDB ERROR: ") + errorMessage(error));
+    const QString msg = errorMessage(error);
+    showMessage(_("HANDLE GDB ERROR: ") + msg);
+    // Show a message box for asynchroneously reported issues.
     switch (error) {
+    case QProcess::FailedToStart:
+        // This should be handled by the code trying to start the process.
+        break;
     case QProcess::Crashed:
-        break; // will get a processExited() as well
-    // impossible case QProcess::FailedToStart:
+        // This will get a processExited() as well.
+        break;
     case QProcess::ReadError:
     case QProcess::WriteError:
     case QProcess::Timedout:
     default:
         //gdbProc()->kill();
         //setState(EngineShutdownRequested, true);
-        showMessageBox(QMessageBox::Critical, tr("Gdb I/O Error"),
-                       errorMessage(error));
+        showMessageBox(QMessageBox::Critical, tr("Gdb I/O Error"), msg);
         break;
     }
 }
diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
index ef2c26e2345dcd85144be1cb0635086d85bf09d5..824b5e78db808ffb7b361b1bcc8333bb123e1900 100644
--- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
+++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
@@ -164,6 +164,11 @@ void RemoteGdbServerAdapter::setupInferior()
 {
     QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state());
 
+    QString fileName;
+    if (!startParameters().executable.isEmpty()) {
+        QFileInfo fi(startParameters().executable);
+        fileName = fi.absoluteFilePath();
+    }
     m_engine->postCommand("set architecture "
         + startParameters().remoteArchitecture.toLatin1());
     m_engine->postCommand("set sysroot "
@@ -177,8 +182,13 @@ void RemoteGdbServerAdapter::setupInferior()
     }
 
     m_engine->postCommand("set target-async on", CB(handleSetTargetAsync));
-    QFileInfo fi(startParameters().executable);
-    QString fileName = fi.absoluteFilePath();
+
+    if (fileName.isEmpty()) {
+        showMessage(tr("No symbol file given."), StatusBar);
+        callTargetRemote();
+        return;
+    }
+
     m_engine->postCommand("-file-exec-and-symbols \""
         + fileName.toLocal8Bit() + '"',
         CB(handleFileExecAndSymbols));
@@ -195,22 +205,27 @@ void RemoteGdbServerAdapter::handleFileExecAndSymbols(const GdbResponse &respons
 {
     QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state());
     if (response.resultClass == GdbResultDone) {
-        //m_breakHandler->clearBreakMarkers();
-
-        // "target remote" does three things:
-        //     (1) connects to the gdb server
-        //     (2) starts the remote application
-        //     (3) stops the remote application (early, e.g. in the dynamic linker)
-        QString channel = startParameters().remoteChannel;
-        m_engine->postCommand("target remote " + channel.toLatin1(),
-            CB(handleTargetRemote));
+        callTargetRemote();
     } else {
-        QString msg = tr("Starting remote executable failed:\n");
+        QString msg = tr("Reading debug information failed:\n");
         msg += QString::fromLocal8Bit(response.data.findChild("msg").data());
         m_engine->notifyInferiorSetupFailed(msg);
     }
 }
 
+void RemoteGdbServerAdapter::callTargetRemote()
+{
+    //m_breakHandler->clearBreakMarkers();
+
+    // "target remote" does three things:
+    //     (1) connects to the gdb server
+    //     (2) starts the remote application
+    //     (3) stops the remote application (early, e.g. in the dynamic linker)
+    QString channel = startParameters().remoteChannel;
+    m_engine->postCommand("target remote " + channel.toLatin1(),
+        CB(handleTargetRemote));
+}
+
 void RemoteGdbServerAdapter::handleTargetRemote(const GdbResponse &record)
 {
     QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state());
diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.h b/src/plugins/debugger/gdb/remotegdbserveradapter.h
index fa4f8c6d2de7b747a787bd93a1cd86b5e5741b92..7eb89200c795eba3bb2c21693ad4c4d261d3c059 100644
--- a/src/plugins/debugger/gdb/remotegdbserveradapter.h
+++ b/src/plugins/debugger/gdb/remotegdbserveradapter.h
@@ -75,6 +75,7 @@ private:
 
     void handleSetTargetAsync(const GdbResponse &response);
     void handleFileExecAndSymbols(const GdbResponse &response);
+    void callTargetRemote();
     void handleTargetRemote(const GdbResponse &response);
 
     const int m_toolChainType;