[Lldb-commits] [lldb] r233061 - Fetch module specification from remote process also
Tamas Berghammer
tberghammer at google.com
Tue Mar 24 04:15:24 PDT 2015
Author: tberghammer
Date: Tue Mar 24 06:15:23 2015
New Revision: 233061
URL: http://llvm.org/viewvc/llvm-project?rev=233061&view=rev
Log:
Fetch module specification from remote process also
Previously the remote module sepcification was fetched only from the
remote platform. With this CL if we have a remote process then we ask it
if it have any information from a given module. It is required because
on android the dynamic linker only reports the name of the SO file and
the platform can't always find it without a full path (the process can
do it based on /proc/<pid>/maps).
Differential revision: http://reviews.llvm.org/D8547
Modified:
lldb/trunk/include/lldb/Host/common/NativeProcessProtocol.h
lldb/trunk/include/lldb/Target/Platform.h
lldb/trunk/include/lldb/Target/Process.h
lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h
lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.h
lldb/trunk/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
lldb/trunk/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
lldb/trunk/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
lldb/trunk/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp
lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h
lldb/trunk/source/Plugins/Platform/Windows/PlatformWindows.cpp
lldb/trunk/source/Plugins/Platform/Windows/PlatformWindows.h
lldb/trunk/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp
lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.h
lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp
lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.h
lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h
lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
lldb/trunk/source/Target/Platform.cpp
lldb/trunk/source/Target/Process.cpp
lldb/trunk/source/Target/Target.cpp
Modified: lldb/trunk/include/lldb/Host/common/NativeProcessProtocol.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/common/NativeProcessProtocol.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Host/common/NativeProcessProtocol.h (original)
+++ lldb/trunk/include/lldb/Host/common/NativeProcessProtocol.h Tue Mar 24 06:15:23 2015
@@ -287,6 +287,9 @@ namespace lldb_private
virtual void
Terminate ();
+ virtual Error
+ GetLoadedModuleFileSpec(const char* module_path, FileSpec& file_spec) = 0;
+
protected:
lldb::pid_t m_pid;
Modified: lldb/trunk/include/lldb/Target/Platform.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Platform.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Platform.h (original)
+++ lldb/trunk/include/lldb/Target/Platform.h Tue Mar 24 06:15:23 2015
@@ -369,9 +369,10 @@ class ModuleCache;
LocateExecutableScriptingResources (Target *target,
Module &module,
Stream* feedback_stream);
-
+
virtual Error
- GetSharedModule (const ModuleSpec &module_spec,
+ GetSharedModule (const ModuleSpec &module_spec,
+ Process* process,
lldb::ModuleSP &module_sp,
const FileSpecList *module_search_paths_ptr,
lldb::ModuleSP *old_module_sp_ptr,
@@ -1131,6 +1132,7 @@ class ModuleCache;
bool
GetCachedSharedModule (const ModuleSpec &module_spec,
+ Process* process,
lldb::ModuleSP &module_sp);
Error
@@ -1141,6 +1143,7 @@ class ModuleCache;
bool
GetModuleFromLocalCache (const ModuleSpec& module_spec,
+ Process* process,
lldb::ModuleSP &module_sp);
FileSpec GetModuleCacheRoot ();
Modified: lldb/trunk/include/lldb/Target/Process.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Process.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Process.h (original)
+++ lldb/trunk/include/lldb/Target/Process.h Tue Mar 24 06:15:23 2015
@@ -2970,7 +2970,6 @@ public:
ProcessRunLock &
GetRunLock ();
-public:
virtual Error
SendEventData(const char *data)
{
@@ -2984,6 +2983,29 @@ public:
lldb::InstrumentationRuntimeSP
GetInstrumentationRuntime(lldb::InstrumentationRuntimeType type);
+ //------------------------------------------------------------------
+ /// Try to fetch the module specification for a module with the
+ /// given file name and architecture. Process sub-classes have to
+ /// override this method if they support platforms where the
+ /// Platform object can't get the module spec for all module.
+ ///
+ /// @param[in] module_file_spec
+ /// The file name of the module to get specification for.
+ ///
+ /// @param[in] arch
+ /// The architecture of the module to get specification for.
+ ///
+ /// @param[out] module_spec
+ /// The fetched module specification if the return value is
+ /// \b true, unchanged otherwise.
+ ///
+ /// @return
+ /// Returns \b true if the module spec fetched successfully,
+ /// \b false otherwise.
+ //------------------------------------------------------------------
+ virtual bool
+ GetModuleSpec(const FileSpec& module_file_spec, const ArchSpec& arch, ModuleSpec &module_spec);
+
protected:
//------------------------------------------------------------------
Modified: lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp (original)
+++ lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp Tue Mar 24 06:15:23 2015
@@ -613,6 +613,7 @@ PlatformFreeBSD::GetFileWithUUID (const
Error
PlatformFreeBSD::GetSharedModule (const ModuleSpec &module_spec,
+ Process* process,
ModuleSP &module_sp,
const FileSpecList *module_search_paths_ptr,
ModuleSP *old_module_sp_ptr,
@@ -628,6 +629,7 @@ PlatformFreeBSD::GetSharedModule (const
if (m_remote_platform_sp)
{
error = m_remote_platform_sp->GetSharedModule (module_spec,
+ process,
module_sp,
module_search_paths_ptr,
old_module_sp_ptr,
@@ -639,6 +641,7 @@ PlatformFreeBSD::GetSharedModule (const
{
// Fall back to the local platform and find the file locally
error = Platform::GetSharedModule (module_spec,
+ process,
module_sp,
module_search_paths_ptr,
old_module_sp_ptr,
Modified: lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h (original)
+++ lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h Tue Mar 24 06:15:23 2015
@@ -152,10 +152,11 @@ public:
lldb_private::Error
GetSharedModule (const lldb_private::ModuleSpec &module_spec,
+ lldb_private::Process* process,
lldb::ModuleSP &module_sp,
const lldb_private::FileSpecList *module_search_paths_ptr,
lldb::ModuleSP *old_module_sp_ptr,
- bool *did_create_ptr);
+ bool *did_create_ptr) override;
virtual bool
GetSupportedArchitectureAtIndex (uint32_t idx, lldb_private::ArchSpec &arch);
Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp (original)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp Tue Mar 24 06:15:23 2015
@@ -234,11 +234,11 @@ PlatformDarwin::ResolveExecutable (const
if (resolved_module_spec.GetArchitecture().IsValid())
{
error = ModuleList::GetSharedModule (resolved_module_spec,
- exe_module_sp,
+ exe_module_sp,
module_search_paths_ptr,
- NULL,
+ NULL,
NULL);
-
+
if (error.Fail() || exe_module_sp.get() == NULL || exe_module_sp->GetObjectFile() == NULL)
{
exe_module_sp.reset();
@@ -256,11 +256,12 @@ PlatformDarwin::ResolveExecutable (const
for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, resolved_module_spec.GetArchitecture()); ++idx)
{
error = GetSharedModule (resolved_module_spec,
- exe_module_sp,
+ NULL,
+ exe_module_sp,
module_search_paths_ptr,
- NULL,
+ NULL,
NULL);
- // Did we find an executable using one of the
+ // Did we find an executable using one of the
if (error.Success())
{
if (exe_module_sp && exe_module_sp->GetObjectFile())
@@ -467,6 +468,7 @@ PlatformDarwin::GetSharedModuleWithLocal
Error
PlatformDarwin::GetSharedModule (const ModuleSpec &module_spec,
+ Process* process,
ModuleSP &module_sp,
const FileSpecList *module_search_paths_ptr,
ModuleSP *old_module_sp_ptr,
@@ -482,6 +484,7 @@ PlatformDarwin::GetSharedModule (const M
if (m_remote_platform_sp)
{
error = m_remote_platform_sp->GetSharedModule (module_spec,
+ process,
module_sp,
module_search_paths_ptr,
old_module_sp_ptr,
@@ -493,6 +496,7 @@ PlatformDarwin::GetSharedModule (const M
{
// Fall back to the local platform and find the file locally
error = Platform::GetSharedModule (module_spec,
+ process,
module_sp,
module_search_paths_ptr,
old_module_sp_ptr,
@@ -513,6 +517,7 @@ PlatformDarwin::GetSharedModule (const M
if (Host::ResolveExecutableInBundle (new_module_spec.GetFileSpec()))
{
Error new_error (Platform::GetSharedModule (new_module_spec,
+ process,
module_sp,
NULL,
old_module_sp_ptr,
@@ -542,6 +547,7 @@ PlatformDarwin::GetSharedModule (const M
ModuleSpec new_module_spec (module_spec);
new_module_spec.GetFileSpec() = new_file_spec;
Error new_error (Platform::GetSharedModule (new_module_spec,
+ process,
module_sp,
NULL,
old_module_sp_ptr,
Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.h (original)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.h Tue Mar 24 06:15:23 2015
@@ -42,9 +42,10 @@ public:
LocateExecutableScriptingResources (lldb_private::Target *target,
lldb_private::Module &module,
lldb_private::Stream* feedback_stream) override;
-
+
lldb_private::Error
GetSharedModule (const lldb_private::ModuleSpec &module_spec,
+ lldb_private::Process* process,
lldb::ModuleSP &module_sp,
const lldb_private::FileSpecList *module_search_paths_ptr,
lldb::ModuleSP *old_module_sp_ptr,
Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp (original)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp Tue Mar 24 06:15:23 2015
@@ -324,6 +324,7 @@ PlatformMacOSX::GetSupportedArchitecture
lldb_private::Error
PlatformMacOSX::GetSharedModule (const lldb_private::ModuleSpec &module_spec,
+ Process* process,
lldb::ModuleSP &module_sp,
const lldb_private::FileSpecList *module_search_paths_ptr,
lldb::ModuleSP *old_module_sp_ptr,
Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformMacOSX.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformMacOSX.h (original)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformMacOSX.h Tue Mar 24 06:15:23 2015
@@ -63,6 +63,7 @@ public:
lldb_private::Error
GetSharedModule (const lldb_private::ModuleSpec &module_spec,
+ lldb_private::Process* process,
lldb::ModuleSP &module_sp,
const lldb_private::FileSpecList *module_search_paths_ptr,
lldb::ModuleSP *old_module_sp_ptr,
Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp (original)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp Tue Mar 24 06:15:23 2015
@@ -693,6 +693,7 @@ PlatformRemoteiOS::GetSymbolFile (const
Error
PlatformRemoteiOS::GetSharedModule (const ModuleSpec &module_spec,
+ Process* process,
ModuleSP &module_sp,
const FileSpecList *module_search_paths_ptr,
ModuleSP *old_module_sp_ptr,
Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h (original)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h Tue Mar 24 06:15:23 2015
@@ -87,6 +87,7 @@ public:
lldb_private::Error
GetSharedModule (const lldb_private::ModuleSpec &module_spec,
+ lldb_private::Process* process,
lldb::ModuleSP &module_sp,
const lldb_private::FileSpecList *module_search_paths_ptr,
lldb::ModuleSP *old_module_sp_ptr,
Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp (original)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp Tue Mar 24 06:15:23 2015
@@ -371,6 +371,7 @@ PlatformiOSSimulator::GetSymbolFile (con
Error
PlatformiOSSimulator::GetSharedModule (const ModuleSpec &module_spec,
+ Process* process,
ModuleSP &module_sp,
const FileSpecList *module_search_paths_ptr,
ModuleSP *old_module_sp_ptr,
Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h (original)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h Tue Mar 24 06:15:23 2015
@@ -85,6 +85,7 @@ public:
lldb_private::Error
GetSharedModule (const lldb_private::ModuleSpec &module_spec,
+ lldb_private::Process* process,
lldb::ModuleSP &module_sp,
const lldb_private::FileSpecList *module_search_paths_ptr,
lldb::ModuleSP *old_module_sp_ptr,
Modified: lldb/trunk/source/Plugins/Platform/Windows/PlatformWindows.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/Windows/PlatformWindows.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/Windows/PlatformWindows.cpp (original)
+++ lldb/trunk/source/Plugins/Platform/Windows/PlatformWindows.cpp Tue Mar 24 06:15:23 2015
@@ -617,6 +617,7 @@ PlatformWindows::GetFileWithUUID (const
Error
PlatformWindows::GetSharedModule (const ModuleSpec &module_spec,
+ Process* process,
ModuleSP &module_sp,
const FileSpecList *module_search_paths_ptr,
ModuleSP *old_module_sp_ptr,
@@ -632,6 +633,7 @@ PlatformWindows::GetSharedModule (const
if (m_remote_platform_sp)
{
error = m_remote_platform_sp->GetSharedModule (module_spec,
+ process,
module_sp,
module_search_paths_ptr,
old_module_sp_ptr,
@@ -643,6 +645,7 @@ PlatformWindows::GetSharedModule (const
{
// Fall back to the local platform and find the file locally
error = Platform::GetSharedModule (module_spec,
+ process,
module_sp,
module_search_paths_ptr,
old_module_sp_ptr,
Modified: lldb/trunk/source/Plugins/Platform/Windows/PlatformWindows.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/Windows/PlatformWindows.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/Windows/PlatformWindows.h (original)
+++ lldb/trunk/source/Plugins/Platform/Windows/PlatformWindows.h Tue Mar 24 06:15:23 2015
@@ -133,10 +133,11 @@ public:
lldb_private::Error
GetSharedModule(const lldb_private::ModuleSpec &module_spec,
+ lldb_private::Process* process,
lldb::ModuleSP &module_sp,
const lldb_private::FileSpecList *module_search_paths_ptr,
lldb::ModuleSP *old_module_sp_ptr,
- bool *did_create_ptr);
+ bool *did_create_ptr) override;
virtual bool
GetSupportedArchitectureAtIndex(uint32_t idx, lldb_private::ArchSpec &arch);
Modified: lldb/trunk/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp (original)
+++ lldb/trunk/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp Tue Mar 24 06:15:23 2015
@@ -207,8 +207,7 @@ PlatformRemoteGDBServer::GetModuleSpec (
const auto module_path = module_file_spec.GetPath ();
- StringExtractorGDBRemote response;
- if (!m_gdb_client.GetModuleInfo (module_path.c_str (), arch, response))
+ if (!m_gdb_client.GetModuleInfo (module_file_spec, arch, module_spec))
{
if (log)
log->Printf ("PlatformRemoteGDBServer::%s - failed to get module info for %s:%s",
@@ -216,51 +215,6 @@ PlatformRemoteGDBServer::GetModuleSpec (
return false;
}
- std::string name;
- std::string value;
- bool success;
- StringExtractor extractor;
-
- module_spec.Clear ();
- module_spec.GetFileSpec () = module_file_spec;
-
- while (response.GetNameColonValue (name, value))
- {
- if (name == "uuid" || name == "md5")
- {
- extractor.GetStringRef ().swap (value);
- extractor.SetFilePos (0);
- extractor.GetHexByteString (value);
- module_spec.GetUUID().SetFromCString (value.c_str(), value.size() / 2);
- }
- else if (name == "triple")
- {
- extractor.GetStringRef ().swap (value);
- extractor.SetFilePos (0);
- extractor.GetHexByteString (value);
- module_spec.GetArchitecture().SetTriple (value.c_str ());
- }
- else if (name == "file_offset")
- {
- const auto ival = StringConvert::ToUInt64 (value.c_str (), 0, 16, &success);
- if (success)
- module_spec.SetObjectOffset (ival);
- }
- else if (name == "file_size")
- {
- const auto ival = StringConvert::ToUInt64 (value.c_str (), 0, 16, &success);
- if (success)
- module_spec.SetObjectSize (ival);
- }
- else if (name == "file_path")
- {
- extractor.GetStringRef ().swap (value);
- extractor.SetFilePos (0);
- extractor.GetHexByteString (value);
- module_spec.GetFileSpec () = FileSpec (value.c_str(), false);
- }
- }
-
if (log)
{
StreamString stream;
Modified: lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp Tue Mar 24 06:15:23 2015
@@ -136,12 +136,13 @@
PtraceWrapper((req), (pid), (addr), (data), (data_size), (error))
#endif
+using namespace lldb;
+using namespace lldb_private;
+using namespace llvm;
+
// Private bits we only need internally.
namespace
{
- using namespace lldb;
- using namespace lldb_private;
-
static void * const EXIT_OPERATION = nullptr;
const UnixSignals&
@@ -1051,8 +1052,6 @@ namespace
}
-using namespace lldb_private;
-
// Simple helper function to ensure flags are enabled on the given file
// descriptor.
static bool
@@ -3979,3 +3978,42 @@ NativeProcessLinux::RequestThreadStop (c
return err;
}
+
+Error
+NativeProcessLinux::GetLoadedModuleFileSpec(const char* module_path, FileSpec& file_spec)
+{
+ char maps_file_name[32];
+ snprintf(maps_file_name, sizeof(maps_file_name), "/proc/%" PRIu64 "/maps", GetID());
+
+ FileSpec maps_file_spec(maps_file_name, false);
+ if (!maps_file_spec.Exists()) {
+ file_spec.Clear();
+ return Error("/proc/%" PRIu64 "/maps file doesn't exists!", GetID());
+ }
+
+ FileSpec module_file_spec(module_path, true);
+
+ std::ifstream maps_file(maps_file_name);
+ std::string maps_data_str((std::istreambuf_iterator<char>(maps_file)), std::istreambuf_iterator<char>());
+ StringRef maps_data(maps_data_str.c_str());
+
+ while (!maps_data.empty())
+ {
+ StringRef maps_row;
+ std::tie(maps_row, maps_data) = maps_data.split('\n');
+
+ SmallVector<StringRef, 16> maps_columns;
+ maps_row.split(maps_columns, StringRef(" "), -1, false);
+
+ if (maps_columns.size() >= 6)
+ {
+ file_spec.SetFile(maps_columns[5].str().c_str(), false);
+ if (file_spec.GetFilename() == module_file_spec.GetFilename())
+ return Error();
+ }
+ }
+
+ file_spec.Clear();
+ return Error("Module file (%s) not found in /proc/%" PRIu64 "/maps file!",
+ module_file_spec.GetFilename().AsCString(), GetID());
+}
Modified: lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.h (original)
+++ lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.h Tue Mar 24 06:15:23 2015
@@ -157,7 +157,10 @@ namespace lldb_private
/// For instance, the extended floating-point register set.
Error
WriteRegisterSet(lldb::tid_t tid, void *buf, size_t buf_size, unsigned int regset);
-
+
+ Error
+ GetLoadedModuleFileSpec(const char* module_path, FileSpec& file_spec) override;
+
protected:
// ---------------------------------------------------------------------
// NativeProcessProtocol protected interface
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp Tue Mar 24 06:15:23 2015
@@ -21,6 +21,7 @@
#include "llvm/ADT/Triple.h"
#include "lldb/Interpreter/Args.h"
#include "lldb/Core/Log.h"
+#include "lldb/Core/ModuleSpec.h"
#include "lldb/Core/State.h"
#include "lldb/Core/StreamGDBRemote.h"
#include "lldb/Core/StreamString.h"
@@ -3705,20 +3706,72 @@ GDBRemoteCommunicationClient::RestoreReg
}
bool
-GDBRemoteCommunicationClient::GetModuleInfo (const char* module_path,
+GDBRemoteCommunicationClient::GetModuleInfo (const FileSpec& module_file_spec,
const lldb_private::ArchSpec& arch_spec,
- StringExtractorGDBRemote &response)
+ ModuleSpec &module_spec)
{
- if (!(module_path && module_path[0]))
+ std::string module_path = module_file_spec.GetPath ();
+ if (module_path.empty ())
return false;
StreamString packet;
packet.PutCString("qModuleInfo:");
- packet.PutBytesAsRawHex8(module_path, strlen(module_path));
+ packet.PutCStringAsRawHex8(module_path.c_str());
packet.PutCString(";");
const auto& tripple = arch_spec.GetTriple().getTriple();
packet.PutBytesAsRawHex8(tripple.c_str(), tripple.size());
- return SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) == PacketResult::Success &&
- !response.IsErrorResponse ();
+ StringExtractorGDBRemote response;
+ if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) != PacketResult::Success)
+ return false;
+
+ if (response.IsErrorResponse ())
+ return false;
+
+ std::string name;
+ std::string value;
+ bool success;
+ StringExtractor extractor;
+
+ module_spec.Clear ();
+ module_spec.GetFileSpec () = module_file_spec;
+
+ while (response.GetNameColonValue (name, value))
+ {
+ if (name == "uuid" || name == "md5")
+ {
+ extractor.GetStringRef ().swap (value);
+ extractor.SetFilePos (0);
+ extractor.GetHexByteString (value);
+ module_spec.GetUUID().SetFromCString (value.c_str(), value.size() / 2);
+ }
+ else if (name == "triple")
+ {
+ extractor.GetStringRef ().swap (value);
+ extractor.SetFilePos (0);
+ extractor.GetHexByteString (value);
+ module_spec.GetArchitecture().SetTriple (value.c_str ());
+ }
+ else if (name == "file_offset")
+ {
+ const auto ival = StringConvert::ToUInt64 (value.c_str (), 0, 16, &success);
+ if (success)
+ module_spec.SetObjectOffset (ival);
+ }
+ else if (name == "file_size")
+ {
+ const auto ival = StringConvert::ToUInt64 (value.c_str (), 0, 16, &success);
+ if (success)
+ module_spec.SetObjectSize (ival);
+ }
+ else if (name == "file_path")
+ {
+ extractor.GetStringRef ().swap (value);
+ extractor.SetFilePos (0);
+ extractor.GetHexByteString (value);
+ module_spec.GetFileSpec () = FileSpec (value.c_str(), false);
+ }
+ }
+
+ return true;
}
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h Tue Mar 24 06:15:23 2015
@@ -535,9 +535,9 @@ public:
GetThreadExtendedInfoSupported();
bool
- GetModuleInfo (const char* module_path,
+ GetModuleInfo (const lldb_private::FileSpec& module_file_spec,
const lldb_private::ArchSpec& arch_spec,
- StringExtractorGDBRemote &response);
+ lldb_private::ModuleSpec &module_spec);
protected:
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp Tue Mar 24 06:15:23 2015
@@ -1144,12 +1144,7 @@ GDBRemoteCommunicationServerCommon::Hand
packet.GetHexByteString(triple);
ArchSpec arch(triple.c_str());
-#ifdef __ANDROID__
- const FileSpec module_path_spec = HostInfoAndroid::ResolveLibraryPath(module_path, arch);
-#else
- const FileSpec module_path_spec(module_path.c_str(), true);
-#endif
-
+ const FileSpec module_path_spec = FindModuleFile(module_path, arch);
const ModuleSpec module_spec(module_path_spec, arch);
ModuleSpecList module_specs;
@@ -1293,3 +1288,14 @@ GDBRemoteCommunicationServerCommon::Crea
response.PutCString ("ptrsize:2;");
}
}
+
+FileSpec
+GDBRemoteCommunicationServerCommon::FindModuleFile(const std::string& module_path,
+ const ArchSpec& arch)
+{
+#ifdef __ANDROID__
+ return HostInfoAndroid::ResolveLibraryPath(module_path, arch);
+#else
+ return FileSpec(module_path.c_str(), true);
+#endif
+}
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.h (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.h Tue Mar 24 06:15:23 2015
@@ -35,26 +35,6 @@ public:
virtual
~GDBRemoteCommunicationServerCommon();
- bool
- GetThreadSuffixSupported () override
- {
- return true;
- }
-
- //------------------------------------------------------------------
- /// Launch a process with the current launch settings.
- ///
- /// This method supports running an lldb-gdbserver or similar
- /// server in a situation where the startup code has been provided
- /// with all the information for a child process to be launched.
- ///
- /// @return
- /// An Error object indicating the success or failure of the
- /// launch.
- //------------------------------------------------------------------
- virtual lldb_private::Error
- LaunchProcess () = 0;
-
protected:
std::set<lldb::pid_t> m_spawned_pids;
lldb_private::Mutex m_spawned_pids_mutex;
@@ -195,6 +175,29 @@ protected:
return (static_cast<T*>(this)->*handler) (packet);
});
}
+
+ bool
+ GetThreadSuffixSupported () override
+ {
+ return true;
+ }
+
+ //------------------------------------------------------------------
+ /// Launch a process with the current launch settings.
+ ///
+ /// This method supports running an lldb-gdbserver or similar
+ /// server in a situation where the startup code has been provided
+ /// with all the information for a child process to be launched.
+ ///
+ /// @return
+ /// An Error object indicating the success or failure of the
+ /// launch.
+ //------------------------------------------------------------------
+ virtual lldb_private::Error
+ LaunchProcess () = 0;
+
+ virtual lldb_private::FileSpec
+ FindModuleFile (const std::string& module_path, const lldb_private::ArchSpec& arch);
};
#endif // liblldb_GDBRemoteCommunicationServerCommon_h_
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp Tue Mar 24 06:15:23 2015
@@ -2735,3 +2735,20 @@ GDBRemoteCommunicationServerLLGS::ClearP
m_active_auxv_buffer_sp.reset ();
#endif
}
+
+FileSpec
+GDBRemoteCommunicationServerLLGS::FindModuleFile(const std::string& module_path,
+ const ArchSpec& arch)
+{
+ if (m_debugged_process_sp)
+ {
+ FileSpec file_spec;
+ if (m_debugged_process_sp->GetLoadedModuleFileSpec(module_path.c_str(), file_spec).Success())
+ {
+ if (file_spec.Exists())
+ return file_spec;
+ }
+ }
+
+ return GDBRemoteCommunicationServerCommon::FindModuleFile(module_path, arch);
+}
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h Tue Mar 24 06:15:23 2015
@@ -252,6 +252,9 @@ protected:
static void
STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len);
+ lldb_private::FileSpec
+ FindModuleFile (const std::string& module_path, const lldb_private::ArchSpec& arch) override;
+
private:
bool
DebuggedProcessReaped (lldb::pid_t pid);
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Tue Mar 24 06:15:23 2015
@@ -3398,6 +3398,34 @@ ProcessGDBRemote::SetUserSpecifiedMaxMem
}
}
+bool
+ProcessGDBRemote::GetModuleSpec(const FileSpec& module_file_spec,
+ const ArchSpec& arch,
+ ModuleSpec &module_spec)
+{
+ Log *log = GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PLATFORM);
+
+ if (!m_gdb_comm.GetModuleInfo (module_file_spec, arch, module_spec))
+ {
+ if (log)
+ log->Printf ("ProcessGDBRemote::%s - failed to get module info for %s:%s",
+ __FUNCTION__, module_file_spec.GetPath ().c_str (),
+ arch.GetTriple ().getTriple ().c_str ());
+ return false;
+ }
+
+ if (log)
+ {
+ StreamString stream;
+ module_spec.Dump (stream);
+ log->Printf ("ProcessGDBRemote::%s - got module info for (%s:%s) : %s",
+ __FUNCTION__, module_file_spec.GetPath ().c_str (),
+ arch.GetTriple ().getTriple ().c_str (), stream.GetString ().c_str ());
+ }
+
+ return true;
+}
+
class CommandObjectProcessGDBRemotePacketHistory : public CommandObjectParsed
{
private:
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h Tue Mar 24 06:15:23 2015
@@ -236,6 +236,11 @@ public:
void
SetUserSpecifiedMaxMemoryTransferSize (uint64_t user_specified_max);
+ bool
+ GetModuleSpec(const lldb_private::FileSpec& module_file_spec,
+ const lldb_private::ArchSpec& arch,
+ lldb_private::ModuleSpec &module_spec) override;
+
protected:
friend class ThreadGDBRemote;
friend class GDBRemoteCommunicationClient;
Modified: lldb/trunk/source/Target/Platform.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Platform.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Target/Platform.cpp (original)
+++ lldb/trunk/source/Target/Platform.cpp Tue Mar 24 06:15:23 2015
@@ -247,6 +247,7 @@ Platform::LocateExecutableScriptingResou
Error
Platform::GetSharedModule (const ModuleSpec &module_spec,
+ Process* process,
ModuleSP &module_sp,
const FileSpecList *module_search_paths_ptr,
ModuleSP *old_module_sp_ptr,
@@ -255,7 +256,7 @@ Platform::GetSharedModule (const ModuleS
if (!IsHost () && GetGlobalPlatformProperties ()->GetUseModuleCache ())
{
// Use caching only when talking to a remote platform.
- if (GetCachedSharedModule (module_spec, module_sp))
+ if (GetCachedSharedModule (module_spec, process, module_sp))
{
if (did_create_ptr)
*did_create_ptr = true;
@@ -1780,7 +1781,7 @@ Platform::LoadCachedExecutable (const Mo
{
if (GetGlobalPlatformProperties ()->GetUseModuleCache ())
{
- if (GetCachedSharedModule (module_spec, module_sp))
+ if (GetCachedSharedModule (module_spec, nullptr, module_sp))
return Error ();
}
@@ -1791,21 +1792,36 @@ Platform::LoadCachedExecutable (const Mo
bool
Platform::GetCachedSharedModule (const ModuleSpec &module_spec,
+ Process* process,
lldb::ModuleSP &module_sp)
{
- return (m_module_cache && GetModuleFromLocalCache (module_spec, module_sp));
+ return (m_module_cache && GetModuleFromLocalCache (module_spec, process, module_sp));
}
bool
Platform::GetModuleFromLocalCache (const ModuleSpec& module_spec,
+ Process* process,
lldb::ModuleSP &module_sp)
{
Log *log = GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PLATFORM);
- // Get module information from a target.
+
ModuleSpec resolved_module_spec;
- if (!GetModuleSpec (module_spec.GetFileSpec (), module_spec.GetArchitecture (), resolved_module_spec))
- return false;
+ bool got_module_spec = false;
+
+ if (process)
+ {
+ // Try to get module information from the process
+ if (process->GetModuleSpec (module_spec.GetFileSpec (), module_spec.GetArchitecture (), resolved_module_spec))
+ got_module_spec = true;
+ }
+
+ if (!got_module_spec)
+ {
+ // Get module information from a target.
+ if (!GetModuleSpec (module_spec.GetFileSpec (), module_spec.GetArchitecture (), resolved_module_spec))
+ return false;
+ }
// Check local cache for a module.
auto error = m_module_cache->Get (GetModuleCacheRoot (),
Modified: lldb/trunk/source/Target/Process.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Target/Process.cpp (original)
+++ lldb/trunk/source/Target/Process.cpp Tue Mar 24 06:15:23 2015
@@ -16,6 +16,7 @@
#include "lldb/Core/Debugger.h"
#include "lldb/Core/Log.h"
#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Core/State.h"
#include "lldb/Core/StreamFile.h"
@@ -6475,3 +6476,12 @@ Process::GetInstrumentationRuntime(lldb:
else
return (*pos).second;
}
+
+bool
+Process::GetModuleSpec(const FileSpec& module_file_spec,
+ const ArchSpec& arch,
+ ModuleSpec& module_spec)
+{
+ module_spec.Clear();
+ return false;
+}
Modified: lldb/trunk/source/Target/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=233061&r1=233060&r2=233061&view=diff
==============================================================================
--- lldb/trunk/source/Target/Target.cpp (original)
+++ lldb/trunk/source/Target/Target.cpp Tue Mar 24 06:15:23 2015
@@ -1727,8 +1727,9 @@ Target::GetSharedModule (const ModuleSpe
// module in the shared module cache.
if (m_platform_sp)
{
- error = m_platform_sp->GetSharedModule (module_spec,
- module_sp,
+ error = m_platform_sp->GetSharedModule (module_spec,
+ m_process_sp.get(),
+ module_sp,
&GetExecutableSearchPaths(),
&old_module_sp,
&did_create_module);
More information about the lldb-commits
mailing list