From e743c78299bb8034c7148e45d69a978af1e30656 Mon Sep 17 00:00:00 2001 From: Enrico Granata Date: Wed, 24 Apr 2013 21:29:08 +0000 Subject: [PATCH] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit “plugin load” tries to be more helpful when it fails to load a plugin llvm-svn: 180218 --- lldb/include/lldb/Core/Debugger.h | 2 +- lldb/include/lldb/Host/DynamicLibrary.h | 3 +++ lldb/source/Commands/CommandObjectPlugin.cpp | 5 ++++- lldb/source/Core/Debugger.cpp | 17 +++++++++++++++-- lldb/source/Host/common/DynamicLibrary.cpp | 6 ++++++ 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h index 4f80430163ce..34e939dec646 100644 --- a/lldb/include/lldb/Core/Debugger.h +++ b/lldb/include/lldb/Core/Debugger.h @@ -330,7 +330,7 @@ public: typedef bool (*LLDBCommandPluginInit) (lldb::SBDebugger& debugger); bool - LoadPlugin (const FileSpec& spec); + LoadPlugin (const FileSpec& spec, Error& error); protected: diff --git a/lldb/include/lldb/Host/DynamicLibrary.h b/lldb/include/lldb/Host/DynamicLibrary.h index 3a360b04f51c..1fcc7d1883cf 100644 --- a/lldb/include/lldb/Host/DynamicLibrary.h +++ b/lldb/include/lldb/Host/DynamicLibrary.h @@ -36,6 +36,9 @@ public: return (T)symbol; } + bool + IsValid (); + private: lldb_private::FileSpec m_filespec; void* m_handle; diff --git a/lldb/source/Commands/CommandObjectPlugin.cpp b/lldb/source/Commands/CommandObjectPlugin.cpp index 395dad752190..1bc7632e2985 100644 --- a/lldb/source/Commands/CommandObjectPlugin.cpp +++ b/lldb/source/Commands/CommandObjectPlugin.cpp @@ -96,10 +96,13 @@ protected: FileSpec dylib_fspec(path,true); - if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec)) + if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec, error)) result.SetStatus(eReturnStatusSuccessFinishResult); else + { + result.AppendError(error.AsCString()); result.SetStatus(eReturnStatusFailed); + } return result.Succeeded(); } diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index f442aa6073dc..42a1540986e1 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -344,20 +344,32 @@ Debugger::SettingsTerminate () } bool -Debugger::LoadPlugin (const FileSpec& spec) +Debugger::LoadPlugin (const FileSpec& spec, Error& error) { lldb::DynamicLibrarySP dynlib_sp(new lldb_private::DynamicLibrary(spec)); + if (!dynlib_sp || dynlib_sp->IsValid() == false) + { + if (spec.Exists()) + error.SetErrorString("this file does not represent a loadable dylib"); + else + error.SetErrorString("no such file"); + return false; + } lldb::DebuggerSP debugger_sp(shared_from_this()); lldb::SBDebugger debugger_sb(debugger_sp); // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays LLDBCommandPluginInit init_func = dynlib_sp->GetSymbol("_ZN4lldb16PluginInitializeENS_10SBDebuggerE"); if (!init_func) + { + error.SetErrorString("cannot find the initialization function lldb::PluginInitialize(lldb::SBDebugger)"); return false; + } if (init_func(debugger_sb)) { m_loaded_plugins.push_back(dynlib_sp); return true; } + error.SetErrorString("dylib refused to be loaded"); return false; } @@ -392,7 +404,8 @@ LoadPluginCallback if (plugin_file_spec.GetFileNameExtension() != g_dylibext) return FileSpec::eEnumerateDirectoryResultNext; - debugger->LoadPlugin (plugin_file_spec); + Error plugin_load_error; + debugger->LoadPlugin (plugin_file_spec, plugin_load_error); return FileSpec::eEnumerateDirectoryResultNext; } diff --git a/lldb/source/Host/common/DynamicLibrary.cpp b/lldb/source/Host/common/DynamicLibrary.cpp index e1ac36668291..315a675895ff 100644 --- a/lldb/source/Host/common/DynamicLibrary.cpp +++ b/lldb/source/Host/common/DynamicLibrary.cpp @@ -20,6 +20,12 @@ DynamicLibrary::DynamicLibrary (const FileSpec& spec, uint32_t options) : m_file m_handle = NULL; } +bool +DynamicLibrary::IsValid () +{ + return m_handle != NULL; +} + DynamicLibrary::~DynamicLibrary () { if (m_handle) -- GitLab