From d4e79230d83f44790345115efddd0252f892e292 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 9 Nov 2018 16:19:12 +0100 Subject: [PATCH] Debugger: Make LLDB startup failures more verbose Fixes: QTCREATORBUG-19612 Change-Id: I7c8ebe3ec734265c8df8a684ccd6bb8991ea8390 Reviewed-by: Christian Stenger Reviewed-by: Eike Ziller --- share/qtcreator/debugger/lldbbridge.py | 7 +++++++ src/plugins/debugger/lldb/lldbengine.cpp | 22 ++++++++++++++-------- src/plugins/debugger/lldb/lldbengine.h | 2 +- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 6cccd84fba7..6093b94f78a 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -2275,3 +2275,10 @@ def __lldb_init_module(debugger, internal_dict): if not __name__ == 'qt': # Make available under global 'qt' name for consistency internal_dict['qt'] = internal_dict[__name__] + + +if __name__ == "lldbbridge": + try: + theDumper = Dumper() + except Exception as error: + print('@\nstate="enginesetupfailed",error="{}"@\n'.format(error)) diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 70daef5ac5d..6df9fb6a31e 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -191,6 +191,11 @@ void LldbEngine::abortDebuggerProcess() notifyEngineShutdownFinished(); } +static QString adapterStartFailed() +{ + return LldbEngine::tr("Adapter start failed."); +} + void LldbEngine::setupEngine() { QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); @@ -211,7 +216,7 @@ void LldbEngine::setupEngine() notifyEngineSetupFailed(); showMessage("ADAPTER START FAILED"); if (!msg.isEmpty()) - ICore::showWarningWithOptions(tr("Adapter start failed."), msg); + ICore::showWarningWithOptions(adapterStartFailed(), msg); return; } m_lldbProc.waitForReadyRead(1000); @@ -222,9 +227,8 @@ void LldbEngine::setupEngine() ICore::resourcePath().toLocal8Bit() + "/debugger/"; m_lldbProc.write("script sys.path.insert(1, '" + dumperSourcePath + "')\n"); + // This triggers reportState("enginesetupok") or "enginesetupfailed": m_lldbProc.write("script from lldbbridge import *\n"); - m_lldbProc.write("script print(dir())\n"); - m_lldbProc.write("script theDumper = Dumper()\n"); // This triggers reportState("enginesetupok") QString commands = nativeStartupCommands(); if (!commands.isEmpty()) @@ -384,7 +388,7 @@ void LldbEngine::handleResponse(const QString &response) cmd.callback(response); } } else if (name == "state") - handleStateNotification(item); + handleStateNotification(all); else if (name == "location") handleLocationNotification(item); else if (name == "output") @@ -830,9 +834,9 @@ void LldbEngine::readLldbStandardOutput() } } -void LldbEngine::handleStateNotification(const GdbMi &reportedState) +void LldbEngine::handleStateNotification(const GdbMi &item) { - QString newState = reportedState.data(); + const QString newState = item["state"].data(); if (newState == "running") notifyInferiorRunOk(); else if (newState == "inferiorrunfailed") @@ -867,9 +871,11 @@ void LldbEngine::handleStateNotification(const GdbMi &reportedState) notifyInferiorIll(); else if (newState == "enginesetupok") notifyEngineSetupOk(); - else if (newState == "enginesetupfailed") + else if (newState == "enginesetupfailed") { + Core::AsynchronousMessageBox::critical(adapterStartFailed(), + item["error"].data()); notifyEngineSetupFailed(); - else if (newState == "enginerunfailed") + } else if (newState == "enginerunfailed") notifyEngineRunFailed(); else if (newState == "enginerunandinferiorrunok") { if (runParameters().continueAfterAttach) diff --git a/src/plugins/debugger/lldb/lldbengine.h b/src/plugins/debugger/lldb/lldbengine.h index aff71500556..f06798dd392 100644 --- a/src/plugins/debugger/lldb/lldbengine.h +++ b/src/plugins/debugger/lldb/lldbengine.h @@ -117,7 +117,7 @@ private: void readLldbStandardOutput(); void readLldbStandardError(); - void handleStateNotification(const GdbMi &state); + void handleStateNotification(const GdbMi &item); void handleLocationNotification(const GdbMi &location); void handleOutputNotification(const GdbMi &output);