2011-03-09 06:40:15 +08:00
//===-- Platform.cpp --------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
# include "lldb/Target/Platform.h"
// C Includes
2015-03-10 09:15:28 +08:00
2011-03-09 06:40:15 +08:00
// C++ Includes
2015-03-10 09:15:28 +08:00
# include <algorithm>
# include <fstream>
# include <vector>
2011-03-09 06:40:15 +08:00
// Other libraries and framework includes
// Project includes
2012-05-15 10:33:01 +08:00
# include "lldb/Breakpoint/BreakpointIDList.h"
2015-03-04 05:05:17 +08:00
# include "lldb/Core/DataBufferHeap.h"
2011-03-09 06:40:15 +08:00
# include "lldb/Core/Error.h"
2011-04-12 13:54:46 +08:00
# include "lldb/Core/Log.h"
2015-03-10 09:15:28 +08:00
# include "lldb/Core/Module.h"
<rdar://problem/11757916>
Make breakpoint setting by file and line much more efficient by only looking for inlined breakpoint locations if we are setting a breakpoint in anything but a source implementation file. Implementing this complex for a many reasons. Turns out that parsing compile units lazily had some issues with respect to how we need to do things with DWARF in .o files. So the fixes in the checkin for this makes these changes:
- Add a new setting called "target.inline-breakpoint-strategy" which can be set to "never", "always", or "headers". "never" will never try and set any inlined breakpoints (fastest). "always" always looks for inlined breakpoint locations (slowest, but most accurate). "headers", which is the default setting, will only look for inlined breakpoint locations if the breakpoint is set in what are consudered to be header files, which is realy defined as "not in an implementation source file".
- modify the breakpoint setting by file and line to check the current "target.inline-breakpoint-strategy" setting and act accordingly
- Modify compile units to be able to get their language and other info lazily. This allows us to create compile units from the debug map and not have to fill all of the details in, and then lazily discover this information as we go on debuggging. This is needed to avoid parsing all .o files when setting breakpoints in implementation only files (no inlines). Otherwise we would need to parse the .o file, the object file (mach-o in our case) and the symbol file (DWARF in the object file) just to see what the compile unit was.
- modify the "SymbolFileDWARFDebugMap" to subclass lldb_private::Module so that the virtual "GetObjectFile()" and "GetSymbolVendor()" functions can be intercepted when the .o file contenst are later lazilly needed. Prior to this fix, when we first instantiated the "SymbolFileDWARFDebugMap" class, we would also make modules, object files and symbol files for every .o file in the debug map because we needed to fix up the sections in the .o files with information that is in the executable debug map. Now we lazily do this in the DebugMapModule::GetObjectFile()
Cleaned up header includes a bit as well.
llvm-svn: 162860
2012-08-30 05:13:06 +08:00
# include "lldb/Core/ModuleSpec.h"
2011-03-09 06:40:15 +08:00
# include "lldb/Core/PluginManager.h"
2015-02-10 11:06:24 +08:00
# include "lldb/Core/StructuredData.h"
2011-03-09 06:40:15 +08:00
# include "lldb/Host/FileSpec.h"
2014-08-16 06:04:21 +08:00
# include "lldb/Host/FileSystem.h"
2011-03-19 09:12:21 +08:00
# include "lldb/Host/Host.h"
2014-08-20 01:18:29 +08:00
# include "lldb/Host/HostInfo.h"
2015-03-10 09:15:28 +08:00
# include "lldb/Interpreter/OptionValueProperties.h"
# include "lldb/Interpreter/Property.h"
# include "lldb/Symbol/ObjectFile.h"
2011-04-12 13:54:46 +08:00
# include "lldb/Target/Process.h"
2011-03-09 06:40:15 +08:00
# include "lldb/Target/Target.h"
2013-08-27 07:57:52 +08:00
# include "lldb/Utility/Utils.h"
2015-03-10 09:15:28 +08:00
# include "llvm/Support/FileSystem.h"
# include "llvm/Support/FileUtilities.h"
# include "Utility/ModuleCache.h"
2011-03-09 06:40:15 +08:00
using namespace lldb ;
using namespace lldb_private ;
2015-02-13 02:18:27 +08:00
static uint32_t g_initialize_count = 0 ;
2011-03-09 06:40:15 +08:00
// Use a singleton function for g_local_platform_sp to avoid init
// constructors since LLDB is often part of a shared library
static PlatformSP &
2014-09-20 04:11:50 +08:00
GetHostPlatformSP ( )
2011-03-09 06:40:15 +08:00
{
2014-09-20 04:11:50 +08:00
static PlatformSP g_platform_sp ;
return g_platform_sp ;
2011-03-09 06:40:15 +08:00
}
2011-04-14 06:47:15 +08:00
const char *
Platform : : GetHostPlatformName ( )
{
return " host " ;
}
2015-03-10 09:15:28 +08:00
namespace {
PropertyDefinition
g_properties [ ] =
{
{ " use-module-cache " , OptionValue : : eTypeBoolean , true , true , nullptr , nullptr , " Use module cache. " } ,
{ " module-cache-directory " , OptionValue : : eTypeFileSpec , true , 0 , nullptr , nullptr , " Root directory for cached modules. " } ,
{ nullptr , OptionValue : : eTypeInvalid , false , 0 , nullptr , nullptr , nullptr }
} ;
enum
{
ePropertyUseModuleCache ,
ePropertyModuleCacheDirectory
} ;
} // namespace
ConstString
PlatformProperties : : GetSettingName ( )
{
static ConstString g_setting_name ( " platform " ) ;
return g_setting_name ;
}
PlatformProperties : : PlatformProperties ( )
{
m_collection_sp . reset ( new OptionValueProperties ( GetSettingName ( ) ) ) ;
m_collection_sp - > Initialize ( g_properties ) ;
auto module_cache_dir = GetModuleCacheDirectory ( ) ;
if ( ! module_cache_dir )
{
if ( ! HostInfo : : GetLLDBPath ( ePathTypeGlobalLLDBTempSystemDir , module_cache_dir ) )
module_cache_dir = FileSpec ( " /tmp/lldb " , false ) ;
module_cache_dir . AppendPathComponent ( " module_cache " ) ;
SetModuleCacheDirectory ( module_cache_dir ) ;
}
}
bool
PlatformProperties : : GetUseModuleCache ( ) const
{
const auto idx = ePropertyUseModuleCache ;
return m_collection_sp - > GetPropertyAtIndexAsBoolean (
nullptr , idx , g_properties [ idx ] . default_uint_value ! = 0 ) ;
}
bool
PlatformProperties : : SetUseModuleCache ( bool use_module_cache )
{
return m_collection_sp - > SetPropertyAtIndexAsBoolean ( nullptr , ePropertyUseModuleCache , use_module_cache ) ;
}
FileSpec
PlatformProperties : : GetModuleCacheDirectory ( ) const
{
return m_collection_sp - > GetPropertyAtIndexAsFileSpec ( nullptr , ePropertyModuleCacheDirectory ) ;
}
bool
PlatformProperties : : SetModuleCacheDirectory ( const FileSpec & dir_spec )
{
return m_collection_sp - > SetPropertyAtIndexAsFileSpec ( nullptr , ePropertyModuleCacheDirectory , dir_spec ) ;
}
2011-03-09 06:40:15 +08:00
//------------------------------------------------------------------
/// Get the native host platform plug-in.
///
/// There should only be one of these for each host that LLDB runs
/// upon that should be statically compiled in and registered using
/// preprocessor macros or other similar build mechanisms.
///
/// This platform will be used as the default platform when launching
/// or attaching to processes unless another platform is specified.
//------------------------------------------------------------------
PlatformSP
2014-09-20 04:11:50 +08:00
Platform : : GetHostPlatform ( )
{
return GetHostPlatformSP ( ) ;
}
static std : : vector < PlatformSP > &
GetPlatformList ( )
2011-03-09 06:40:15 +08:00
{
2014-09-20 04:11:50 +08:00
static std : : vector < PlatformSP > g_platform_list ;
return g_platform_list ;
}
static Mutex &
GetPlatformListMutex ( )
{
static Mutex g_mutex ( Mutex : : eMutexTypeRecursive ) ;
return g_mutex ;
2011-03-09 06:40:15 +08:00
}
2015-02-13 02:18:27 +08:00
void
Platform : : Initialize ( )
{
g_initialize_count + + ;
}
void
Platform : : Terminate ( )
{
if ( g_initialize_count > 0 )
{
if ( - - g_initialize_count = = 0 )
{
Mutex : : Locker locker ( GetPlatformListMutex ( ) ) ;
GetPlatformList ( ) . clear ( ) ;
}
}
}
2015-03-10 09:15:28 +08:00
const PlatformPropertiesSP &
Platform : : GetGlobalPlatformProperties ( )
{
static const auto g_settings_sp ( std : : make_shared < PlatformProperties > ( ) ) ;
return g_settings_sp ;
}
2011-03-09 06:40:15 +08:00
void
2014-09-20 04:11:50 +08:00
Platform : : SetHostPlatform ( const lldb : : PlatformSP & platform_sp )
2011-03-09 06:40:15 +08:00
{
// The native platform should use its static void Platform::Initialize()
// function to register itself as the native platform.
2014-09-20 04:11:50 +08:00
GetHostPlatformSP ( ) = platform_sp ;
if ( platform_sp )
{
Mutex : : Locker locker ( GetPlatformListMutex ( ) ) ;
GetPlatformList ( ) . push_back ( platform_sp ) ;
}
2011-03-09 06:40:15 +08:00
}
Error
2014-01-18 02:18:31 +08:00
Platform : : GetFileWithUUID ( const FileSpec & platform_file ,
const UUID * uuid_ptr ,
FileSpec & local_file )
2011-03-09 06:40:15 +08:00
{
// Default to the local case
local_file = platform_file ;
return Error ( ) ;
}
2013-01-12 07:44:27 +08:00
FileSpecList
2014-08-16 08:32:58 +08:00
Platform : : LocateExecutableScriptingResources ( Target * target , Module & module , Stream * feedback_stream )
2012-11-08 10:22:02 +08:00
{
2013-01-12 07:44:27 +08:00
return FileSpecList ( ) ;
2012-11-08 10:22:02 +08:00
}
2014-09-20 04:11:50 +08:00
//PlatformSP
//Platform::FindPlugin (Process *process, const ConstString &plugin_name)
//{
// PlatformCreateInstance create_callback = NULL;
// if (plugin_name)
// {
// create_callback = PluginManager::GetPlatformCreateCallbackForPluginName (plugin_name);
// if (create_callback)
// {
// ArchSpec arch;
// if (process)
// {
// arch = process->GetTarget().GetArchitecture();
// }
// PlatformSP platform_sp(create_callback(process, &arch));
// if (platform_sp)
// return platform_sp;
// }
// }
// else
// {
// for (uint32_t idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex(idx)) != NULL; ++idx)
// {
// PlatformSP platform_sp(create_callback(process, nullptr));
// if (platform_sp)
// return platform_sp;
// }
// }
// return PlatformSP();
//}
2013-04-05 09:03:25 +08:00
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
Error
2012-02-26 13:51:37 +08:00
Platform : : GetSharedModule ( const ModuleSpec & module_spec ,
2015-03-24 19:15:23 +08:00
Process * process ,
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
ModuleSP & module_sp ,
2012-02-14 07:10:39 +08:00
const FileSpecList * module_search_paths_ptr ,
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
ModuleSP * old_module_sp_ptr ,
bool * did_create_ptr )
{
2015-03-25 07:45:49 +08:00
if ( IsHost ( ) )
return ModuleList : : GetSharedModule ( module_spec ,
module_sp ,
module_search_paths_ptr ,
old_module_sp_ptr ,
did_create_ptr ,
false ) ;
return GetRemoteSharedModule ( module_spec ,
process ,
module_sp ,
[ & ] ( const ModuleSpec & spec )
{
return ModuleList : : GetSharedModule (
spec , module_sp , module_search_paths_ptr , old_module_sp_ptr , did_create_ptr , false ) ;
} ,
did_create_ptr ) ;
2015-03-10 09:15:28 +08:00
}
bool
Platform : : GetModuleSpec ( const FileSpec & module_file_spec ,
const ArchSpec & arch ,
ModuleSpec & module_spec )
{
ModuleSpecList module_specs ;
if ( ObjectFile : : GetModuleSpecifications ( module_file_spec , 0 , 0 , module_specs ) = = 0 )
return false ;
ModuleSpec matched_module_spec ;
return module_specs . FindMatchingModuleSpec ( ModuleSpec ( module_file_spec , arch ) ,
module_spec ) ;
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
}
2011-03-09 06:40:15 +08:00
PlatformSP
2014-09-20 04:11:50 +08:00
Platform : : Find ( const ConstString & name )
{
if ( name )
{
static ConstString g_host_platform_name ( " host " ) ;
if ( name = = g_host_platform_name )
return GetHostPlatform ( ) ;
Mutex : : Locker locker ( GetPlatformListMutex ( ) ) ;
for ( const auto & platform_sp : GetPlatformList ( ) )
{
if ( platform_sp - > GetName ( ) = = name )
return platform_sp ;
}
}
return PlatformSP ( ) ;
}
PlatformSP
Platform : : Create ( const ConstString & name , Error & error )
2011-03-09 06:40:15 +08:00
{
PlatformCreateInstance create_callback = NULL ;
lldb : : PlatformSP platform_sp ;
2014-09-20 04:11:50 +08:00
if ( name )
2011-03-09 06:40:15 +08:00
{
2014-09-20 04:11:50 +08:00
static ConstString g_host_platform_name ( " host " ) ;
if ( name = = g_host_platform_name )
return GetHostPlatform ( ) ;
create_callback = PluginManager : : GetPlatformCreateCallbackForPluginName ( name ) ;
2011-03-09 06:40:15 +08:00
if ( create_callback )
2014-09-20 04:11:50 +08:00
platform_sp = create_callback ( true , NULL ) ;
2011-03-09 06:40:15 +08:00
else
2014-09-20 04:11:50 +08:00
error . SetErrorStringWithFormat ( " unable to find a plug-in for the platform named \" %s \" " , name . GetCString ( ) ) ;
2011-03-09 06:40:15 +08:00
}
else
2011-03-19 09:12:21 +08:00
error . SetErrorString ( " invalid platform name " ) ;
2014-09-20 04:11:50 +08:00
if ( platform_sp )
{
Mutex : : Locker locker ( GetPlatformListMutex ( ) ) ;
GetPlatformList ( ) . push_back ( platform_sp ) ;
}
2011-03-09 06:40:15 +08:00
return platform_sp ;
}
2012-03-21 02:34:04 +08:00
PlatformSP
2012-05-08 09:45:38 +08:00
Platform : : Create ( const ArchSpec & arch , ArchSpec * platform_arch_ptr , Error & error )
2012-03-21 02:34:04 +08:00
{
lldb : : PlatformSP platform_sp ;
if ( arch . IsValid ( ) )
{
2014-09-20 04:11:50 +08:00
// Scope for locker
{
// First try exact arch matches across all platforms already created
Mutex : : Locker locker ( GetPlatformListMutex ( ) ) ;
for ( const auto & platform_sp : GetPlatformList ( ) )
{
if ( platform_sp - > IsCompatibleArchitecture ( arch , true , platform_arch_ptr ) )
return platform_sp ;
}
// Next try compatible arch matches across all platforms already created
for ( const auto & platform_sp : GetPlatformList ( ) )
{
if ( platform_sp - > IsCompatibleArchitecture ( arch , false , platform_arch_ptr ) )
return platform_sp ;
}
}
2012-03-21 02:34:04 +08:00
PlatformCreateInstance create_callback ;
2013-01-12 04:49:54 +08:00
// First try exact arch matches across all platform plug-ins
2014-09-20 04:11:50 +08:00
uint32_t idx ;
2012-05-08 09:45:38 +08:00
for ( idx = 0 ; ( create_callback = PluginManager : : GetPlatformCreateCallbackAtIndex ( idx ) ) ; + + idx )
2012-03-21 02:34:04 +08:00
{
if ( create_callback )
2013-01-12 04:49:54 +08:00
{
2014-09-20 04:11:50 +08:00
platform_sp = create_callback ( false , & arch ) ;
if ( platform_sp & & platform_sp - > IsCompatibleArchitecture ( arch , true , platform_arch_ptr ) )
{
Mutex : : Locker locker ( GetPlatformListMutex ( ) ) ;
GetPlatformList ( ) . push_back ( platform_sp ) ;
2013-01-12 04:49:54 +08:00
return platform_sp ;
2014-09-20 04:11:50 +08:00
}
2013-01-12 04:49:54 +08:00
}
}
// Next try compatible arch matches across all platform plug-ins
for ( idx = 0 ; ( create_callback = PluginManager : : GetPlatformCreateCallbackAtIndex ( idx ) ) ; + + idx )
{
if ( create_callback )
{
2014-09-20 04:11:50 +08:00
platform_sp = create_callback ( false , & arch ) ;
if ( platform_sp & & platform_sp - > IsCompatibleArchitecture ( arch , false , platform_arch_ptr ) )
{
Mutex : : Locker locker ( GetPlatformListMutex ( ) ) ;
GetPlatformList ( ) . push_back ( platform_sp ) ;
2013-01-12 04:49:54 +08:00
return platform_sp ;
2014-09-20 04:11:50 +08:00
}
2013-01-12 04:49:54 +08:00
}
2012-03-21 02:34:04 +08:00
}
}
else
error . SetErrorString ( " invalid platform name " ) ;
2012-05-08 09:45:38 +08:00
if ( platform_arch_ptr )
platform_arch_ptr - > Clear ( ) ;
platform_sp . reset ( ) ;
2012-03-21 02:34:04 +08:00
return platform_sp ;
}
2011-03-09 06:40:15 +08:00
//------------------------------------------------------------------
/// Default Constructor
//------------------------------------------------------------------
2011-03-19 09:12:21 +08:00
Platform : : Platform ( bool is_host ) :
m_is_host ( is_host ) ,
m_os_version_set_while_connected ( false ) ,
m_system_arch_set_while_connected ( false ) ,
2011-06-17 11:31:01 +08:00
m_sdk_sysroot ( ) ,
m_sdk_build ( ) ,
2013-11-21 05:07:01 +08:00
m_working_dir ( ) ,
2011-03-19 09:12:21 +08:00
m_remote_url ( ) ,
2011-03-24 12:28:38 +08:00
m_name ( ) ,
2011-03-19 09:12:21 +08:00
m_major_os_version ( UINT32_MAX ) ,
m_minor_os_version ( UINT32_MAX ) ,
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
m_update_os_version ( UINT32_MAX ) ,
m_system_arch ( ) ,
2015-02-03 04:45:17 +08:00
m_mutex ( Mutex : : eMutexTypeRecursive ) ,
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
m_uid_map ( ) ,
m_gid_map ( ) ,
m_max_uid_name_len ( 0 ) ,
2013-08-27 07:57:52 +08:00
m_max_gid_name_len ( 0 ) ,
m_supports_rsync ( false ) ,
m_rsync_opts ( ) ,
m_rsync_prefix ( ) ,
m_supports_ssh ( false ) ,
m_ssh_opts ( ) ,
2014-02-13 15:11:08 +08:00
m_ignores_remote_hostname ( false ) ,
2014-02-14 07:11:45 +08:00
m_trap_handlers ( ) ,
2015-03-10 09:15:28 +08:00
m_calculated_trap_handlers ( false ) ,
m_module_cache ( llvm : : make_unique < ModuleCache > ( ) )
2011-03-09 06:40:15 +08:00
{
2013-03-28 07:08:40 +08:00
Log * log ( lldb_private : : GetLogIfAllCategoriesSet ( LIBLLDB_LOG_OBJECT ) ) ;
2011-04-12 13:54:46 +08:00
if ( log )
2014-04-04 12:06:10 +08:00
log - > Printf ( " %p Platform::Platform() " , static_cast < void * > ( this ) ) ;
2011-03-09 06:40:15 +08:00
}
//------------------------------------------------------------------
/// Destructor.
///
/// The destructor is virtual since this class is designed to be
/// inherited from by the plug-in instance.
//------------------------------------------------------------------
Platform : : ~ Platform ( )
{
2013-03-28 07:08:40 +08:00
Log * log ( lldb_private : : GetLogIfAllCategoriesSet ( LIBLLDB_LOG_OBJECT ) ) ;
2011-04-12 13:54:46 +08:00
if ( log )
2014-04-04 12:06:10 +08:00
log - > Printf ( " %p Platform::~Platform() " , static_cast < void * > ( this ) ) ;
2011-03-09 06:40:15 +08:00
}
2011-03-24 12:28:38 +08:00
void
Platform : : GetStatus ( Stream & strm )
{
uint32_t major = UINT32_MAX ;
uint32_t minor = UINT32_MAX ;
uint32_t update = UINT32_MAX ;
std : : string s ;
2013-05-11 05:47:16 +08:00
strm . Printf ( " Platform: %s \n " , GetPluginName ( ) . GetCString ( ) ) ;
2011-03-24 12:28:38 +08:00
ArchSpec arch ( GetSystemArchitecture ( ) ) ;
if ( arch . IsValid ( ) )
{
if ( ! arch . GetTriple ( ) . str ( ) . empty ( ) )
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
strm . Printf ( " Triple: %s \n " , arch . GetTriple ( ) . str ( ) . c_str ( ) ) ;
2011-03-24 12:28:38 +08:00
}
if ( GetOSVersion ( major , minor , update ) )
{
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
strm . Printf ( " OS Version: %u " , major ) ;
2011-03-24 12:28:38 +08:00
if ( minor ! = UINT32_MAX )
strm . Printf ( " .%u " , minor ) ;
if ( update ! = UINT32_MAX )
strm . Printf ( " .%u " , update ) ;
if ( GetOSBuildString ( s ) )
strm . Printf ( " (%s) " , s . c_str ( ) ) ;
strm . EOL ( ) ;
}
if ( GetOSKernelDescription ( s ) )
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
strm . Printf ( " Kernel: %s \n " , s . c_str ( ) ) ;
2011-03-24 12:28:38 +08:00
if ( IsHost ( ) )
{
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
strm . Printf ( " Hostname: %s \n " , GetHostname ( ) ) ;
2011-03-24 12:28:38 +08:00
}
else
{
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
const bool is_connected = IsConnected ( ) ;
if ( is_connected )
strm . Printf ( " Hostname: %s \n " , GetHostname ( ) ) ;
strm . Printf ( " Connected: %s \n " , is_connected ? " yes " : " no " ) ;
2011-03-24 12:28:38 +08:00
}
2013-08-27 07:57:52 +08:00
2013-11-21 05:07:01 +08:00
if ( GetWorkingDirectory ( ) )
{
strm . Printf ( " WorkingDir: %s \n " , GetWorkingDirectory ( ) . GetCString ( ) ) ;
}
2013-08-27 07:57:52 +08:00
if ( ! IsConnected ( ) )
return ;
std : : string specific_info ( GetPlatformSpecificConnectionInformation ( ) ) ;
if ( specific_info . empty ( ) = = false )
strm . Printf ( " Platform-specific connection: %s \n " , specific_info . c_str ( ) ) ;
2011-03-24 12:28:38 +08:00
}
2011-03-19 09:12:21 +08:00
bool
Platform : : GetOSVersion ( uint32_t & major ,
uint32_t & minor ,
uint32_t & update )
{
2015-02-03 04:45:17 +08:00
Mutex : : Locker locker ( m_mutex ) ;
2011-03-19 09:12:21 +08:00
bool success = m_major_os_version ! = UINT32_MAX ;
if ( IsHost ( ) )
{
if ( ! success )
{
// We have a local host platform
2014-08-20 01:18:29 +08:00
success = HostInfo : : GetOSVersion ( m_major_os_version , m_minor_os_version , m_update_os_version ) ;
2011-03-19 09:12:21 +08:00
m_os_version_set_while_connected = success ;
}
}
else
{
// We have a remote platform. We can only fetch the remote
// OS version if we are connected, and we don't want to do it
// more than once.
const bool is_connected = IsConnected ( ) ;
2011-03-24 12:28:38 +08:00
bool fetch = false ;
2011-03-19 09:12:21 +08:00
if ( success )
{
// We have valid OS version info, check to make sure it wasn't
// manually set prior to connecting. If it was manually set prior
// to connecting, then lets fetch the actual OS version info
// if we are now connected.
if ( is_connected & & ! m_os_version_set_while_connected )
2011-03-24 12:28:38 +08:00
fetch = true ;
2011-03-19 09:12:21 +08:00
}
else
{
// We don't have valid OS version info, fetch it if we are connected
2011-03-24 12:28:38 +08:00
fetch = is_connected ;
2011-03-19 09:12:21 +08:00
}
2011-03-24 12:28:38 +08:00
if ( fetch )
2011-03-19 09:12:21 +08:00
{
2011-03-24 12:28:38 +08:00
success = GetRemoteOSVersion ( ) ;
2011-03-19 09:12:21 +08:00
m_os_version_set_while_connected = success ;
}
}
if ( success )
{
major = m_major_os_version ;
minor = m_minor_os_version ;
update = m_update_os_version ;
}
return success ;
}
2011-03-24 12:28:38 +08:00
bool
Platform : : GetOSBuildString ( std : : string & s )
{
2014-08-20 01:18:29 +08:00
s . clear ( ) ;
2011-03-24 12:28:38 +08:00
if ( IsHost ( ) )
2014-08-20 01:18:29 +08:00
# if !defined(__linux__)
return HostInfo : : GetOSBuildString ( s ) ;
# else
return false ;
# endif
2011-03-24 12:28:38 +08:00
else
return GetRemoteOSBuildString ( s ) ;
}
bool
Platform : : GetOSKernelDescription ( std : : string & s )
{
if ( IsHost ( ) )
2014-08-20 01:18:29 +08:00
# if !defined(__linux__)
return HostInfo : : GetOSKernelDescription ( s ) ;
# else
return false ;
# endif
2011-03-24 12:28:38 +08:00
else
return GetRemoteOSKernelDescription ( s ) ;
}
2014-12-05 09:16:31 +08:00
void
2015-01-23 02:25:49 +08:00
Platform : : AddClangModuleCompilationOptions ( Target * target , std : : vector < std : : string > & options )
2014-12-05 09:16:31 +08:00
{
std : : vector < std : : string > default_compilation_options =
{
" -x " , " c++ " , " -Xclang " , " -nostdsysteminc " , " -Xclang " , " -nostdsysteminc "
} ;
options . insert ( options . end ( ) ,
default_compilation_options . begin ( ) ,
default_compilation_options . end ( ) ) ;
}
2013-11-21 05:07:01 +08:00
ConstString
Platform : : GetWorkingDirectory ( )
{
if ( IsHost ( ) )
{
char cwd [ PATH_MAX ] ;
if ( getcwd ( cwd , sizeof ( cwd ) ) )
return ConstString ( cwd ) ;
else
return ConstString ( ) ;
}
else
{
if ( ! m_working_dir )
m_working_dir = GetRemoteWorkingDirectory ( ) ;
return m_working_dir ;
}
}
struct RecurseCopyBaton
{
const FileSpec & dst ;
Platform * platform_ptr ;
Error error ;
} ;
static FileSpec : : EnumerateDirectoryResult
RecurseCopy_Callback ( void * baton ,
FileSpec : : FileType file_type ,
const FileSpec & src )
{
RecurseCopyBaton * rc_baton = ( RecurseCopyBaton * ) baton ;
switch ( file_type )
{
case FileSpec : : eFileTypePipe :
case FileSpec : : eFileTypeSocket :
// we have no way to copy pipes and sockets - ignore them and continue
return FileSpec : : eEnumerateDirectoryResultNext ;
break ;
case FileSpec : : eFileTypeDirectory :
{
// make the new directory and get in there
FileSpec dst_dir = rc_baton - > dst ;
if ( ! dst_dir . GetFilename ( ) )
dst_dir . GetFilename ( ) = src . GetLastPathComponent ( ) ;
std : : string dst_dir_path ( dst_dir . GetPath ( ) ) ;
Error error = rc_baton - > platform_ptr - > MakeDirectory ( dst_dir_path . c_str ( ) , lldb : : eFilePermissionsDirectoryDefault ) ;
if ( error . Fail ( ) )
{
rc_baton - > error . SetErrorStringWithFormat ( " unable to setup directory %s on remote end " , dst_dir_path . c_str ( ) ) ;
return FileSpec : : eEnumerateDirectoryResultQuit ; // got an error, bail out
}
// now recurse
std : : string src_dir_path ( src . GetPath ( ) ) ;
// Make a filespec that only fills in the directory of a FileSpec so
// when we enumerate we can quickly fill in the filename for dst copies
FileSpec recurse_dst ;
recurse_dst . GetDirectory ( ) . SetCString ( dst_dir . GetPath ( ) . c_str ( ) ) ;
RecurseCopyBaton rc_baton2 = { recurse_dst , rc_baton - > platform_ptr , Error ( ) } ;
FileSpec : : EnumerateDirectory ( src_dir_path . c_str ( ) , true , true , true , RecurseCopy_Callback , & rc_baton2 ) ;
if ( rc_baton2 . error . Fail ( ) )
{
rc_baton - > error . SetErrorString ( rc_baton2 . error . AsCString ( ) ) ;
return FileSpec : : eEnumerateDirectoryResultQuit ; // got an error, bail out
}
return FileSpec : : eEnumerateDirectoryResultNext ;
}
break ;
case FileSpec : : eFileTypeSymbolicLink :
{
// copy the file and keep going
FileSpec dst_file = rc_baton - > dst ;
if ( ! dst_file . GetFilename ( ) )
dst_file . GetFilename ( ) = src . GetFilename ( ) ;
char buf [ PATH_MAX ] ;
2014-08-16 06:04:21 +08:00
rc_baton - > error = FileSystem : : Readlink ( src . GetPath ( ) . c_str ( ) , buf , sizeof ( buf ) ) ;
2013-11-21 05:07:01 +08:00
if ( rc_baton - > error . Fail ( ) )
return FileSpec : : eEnumerateDirectoryResultQuit ; // got an error, bail out
rc_baton - > error = rc_baton - > platform_ptr - > CreateSymlink ( dst_file . GetPath ( ) . c_str ( ) , buf ) ;
if ( rc_baton - > error . Fail ( ) )
return FileSpec : : eEnumerateDirectoryResultQuit ; // got an error, bail out
return FileSpec : : eEnumerateDirectoryResultNext ;
}
break ;
case FileSpec : : eFileTypeRegular :
{
// copy the file and keep going
FileSpec dst_file = rc_baton - > dst ;
if ( ! dst_file . GetFilename ( ) )
dst_file . GetFilename ( ) = src . GetFilename ( ) ;
Error err = rc_baton - > platform_ptr - > PutFile ( src , dst_file ) ;
if ( err . Fail ( ) )
{
rc_baton - > error . SetErrorString ( err . AsCString ( ) ) ;
return FileSpec : : eEnumerateDirectoryResultQuit ; // got an error, bail out
}
return FileSpec : : eEnumerateDirectoryResultNext ;
}
break ;
case FileSpec : : eFileTypeInvalid :
case FileSpec : : eFileTypeOther :
case FileSpec : : eFileTypeUnknown :
rc_baton - > error . SetErrorStringWithFormat ( " invalid file detected during copy: %s " , src . GetPath ( ) . c_str ( ) ) ;
return FileSpec : : eEnumerateDirectoryResultQuit ; // got an error, bail out
break ;
}
2014-09-16 14:34:29 +08:00
llvm_unreachable ( " Unhandled FileSpec::FileType! " ) ;
2013-11-21 05:07:01 +08:00
}
Error
Platform : : Install ( const FileSpec & src , const FileSpec & dst )
{
Error error ;
Log * log = GetLogIfAnyCategoriesSet ( LIBLLDB_LOG_PLATFORM ) ;
if ( log )
log - > Printf ( " Platform::Install (src='%s', dst='%s') " , src . GetPath ( ) . c_str ( ) , dst . GetPath ( ) . c_str ( ) ) ;
FileSpec fixed_dst ( dst ) ;
if ( ! fixed_dst . GetFilename ( ) )
fixed_dst . GetFilename ( ) = src . GetFilename ( ) ;
ConstString working_dir = GetWorkingDirectory ( ) ;
if ( dst )
{
if ( dst . GetDirectory ( ) )
{
const char first_dst_dir_char = dst . GetDirectory ( ) . GetCString ( ) [ 0 ] ;
if ( first_dst_dir_char = = ' / ' | | first_dst_dir_char = = ' \\ ' )
{
fixed_dst . GetDirectory ( ) = dst . GetDirectory ( ) ;
}
// If the fixed destination file doesn't have a directory yet,
// then we must have a relative path. We will resolve this relative
// path against the platform's working directory
if ( ! fixed_dst . GetDirectory ( ) )
{
FileSpec relative_spec ;
std : : string path ;
if ( working_dir )
{
relative_spec . SetFile ( working_dir . GetCString ( ) , false ) ;
relative_spec . AppendPathComponent ( dst . GetPath ( ) . c_str ( ) ) ;
fixed_dst . GetDirectory ( ) = relative_spec . GetDirectory ( ) ;
}
else
{
error . SetErrorStringWithFormat ( " platform working directory must be valid for relative path '%s' " , dst . GetPath ( ) . c_str ( ) ) ;
return error ;
}
}
}
else
{
if ( working_dir )
{
fixed_dst . GetDirectory ( ) = working_dir ;
}
else
{
error . SetErrorStringWithFormat ( " platform working directory must be valid for relative path '%s' " , dst . GetPath ( ) . c_str ( ) ) ;
return error ;
}
}
}
else
{
if ( working_dir )
{
fixed_dst . GetDirectory ( ) = working_dir ;
}
else
{
error . SetErrorStringWithFormat ( " platform working directory must be valid when destination directory is empty " ) ;
return error ;
}
}
if ( log )
log - > Printf ( " Platform::Install (src='%s', dst='%s') fixed_dst='%s' " , src . GetPath ( ) . c_str ( ) , dst . GetPath ( ) . c_str ( ) , fixed_dst . GetPath ( ) . c_str ( ) ) ;
if ( GetSupportsRSync ( ) )
{
error = PutFile ( src , dst ) ;
}
else
{
switch ( src . GetFileType ( ) )
{
case FileSpec : : eFileTypeDirectory :
{
if ( GetFileExists ( fixed_dst ) )
Unlink ( fixed_dst . GetPath ( ) . c_str ( ) ) ;
uint32_t permissions = src . GetPermissions ( ) ;
if ( permissions = = 0 )
permissions = eFilePermissionsDirectoryDefault ;
std : : string dst_dir_path ( fixed_dst . GetPath ( ) ) ;
error = MakeDirectory ( dst_dir_path . c_str ( ) , permissions ) ;
if ( error . Success ( ) )
{
// Make a filespec that only fills in the directory of a FileSpec so
// when we enumerate we can quickly fill in the filename for dst copies
FileSpec recurse_dst ;
recurse_dst . GetDirectory ( ) . SetCString ( dst_dir_path . c_str ( ) ) ;
std : : string src_dir_path ( src . GetPath ( ) ) ;
RecurseCopyBaton baton = { recurse_dst , this , Error ( ) } ;
FileSpec : : EnumerateDirectory ( src_dir_path . c_str ( ) , true , true , true , RecurseCopy_Callback , & baton ) ;
return baton . error ;
}
}
break ;
case FileSpec : : eFileTypeRegular :
if ( GetFileExists ( fixed_dst ) )
Unlink ( fixed_dst . GetPath ( ) . c_str ( ) ) ;
error = PutFile ( src , fixed_dst ) ;
break ;
case FileSpec : : eFileTypeSymbolicLink :
{
if ( GetFileExists ( fixed_dst ) )
Unlink ( fixed_dst . GetPath ( ) . c_str ( ) ) ;
char buf [ PATH_MAX ] ;
2014-08-16 06:04:21 +08:00
error = FileSystem : : Readlink ( src . GetPath ( ) . c_str ( ) , buf , sizeof ( buf ) ) ;
2013-11-21 05:07:01 +08:00
if ( error . Success ( ) )
error = CreateSymlink ( dst . GetPath ( ) . c_str ( ) , buf ) ;
}
break ;
case FileSpec : : eFileTypePipe :
error . SetErrorString ( " platform install doesn't handle pipes " ) ;
break ;
case FileSpec : : eFileTypeSocket :
error . SetErrorString ( " platform install doesn't handle sockets " ) ;
break ;
case FileSpec : : eFileTypeInvalid :
case FileSpec : : eFileTypeUnknown :
case FileSpec : : eFileTypeOther :
error . SetErrorString ( " platform install doesn't handle non file or directory items " ) ;
break ;
}
}
return error ;
}
bool
Platform : : SetWorkingDirectory ( const ConstString & path )
{
if ( IsHost ( ) )
{
2013-12-03 03:35:49 +08:00
Log * log = GetLogIfAnyCategoriesSet ( LIBLLDB_LOG_PLATFORM ) ;
if ( log )
log - > Printf ( " Platform::SetWorkingDirectory('%s') " , path . GetCString ( ) ) ;
2013-11-26 23:10:46 +08:00
# ifdef _WIN32
// Not implemented on Windows
return false ;
# else
2013-11-21 05:07:01 +08:00
if ( path )
{
if ( chdir ( path . GetCString ( ) ) = = 0 )
return true ;
}
return false ;
2013-11-26 23:10:46 +08:00
# endif
2013-11-21 05:07:01 +08:00
}
else
{
2013-12-03 03:35:49 +08:00
m_working_dir . Clear ( ) ;
2013-11-21 05:07:01 +08:00
return SetRemoteWorkingDirectory ( path ) ;
}
}
Error
Platform : : MakeDirectory ( const char * path , uint32_t permissions )
{
if ( IsHost ( ) )
2014-08-16 06:04:21 +08:00
return FileSystem : : MakeDirectory ( path , permissions ) ;
2013-11-21 05:07:01 +08:00
else
{
Error error ;
error . SetErrorStringWithFormat ( " remote platform %s doesn't support %s " , GetPluginName ( ) . GetCString ( ) , __PRETTY_FUNCTION__ ) ;
return error ;
}
}
Error
Platform : : GetFilePermissions ( const char * path , uint32_t & file_permissions )
{
if ( IsHost ( ) )
2014-08-16 06:04:21 +08:00
return FileSystem : : GetFilePermissions ( path , file_permissions ) ;
2013-11-21 05:07:01 +08:00
else
{
Error error ;
error . SetErrorStringWithFormat ( " remote platform %s doesn't support %s " , GetPluginName ( ) . GetCString ( ) , __PRETTY_FUNCTION__ ) ;
return error ;
}
}
Error
Platform : : SetFilePermissions ( const char * path , uint32_t file_permissions )
{
if ( IsHost ( ) )
2014-08-16 06:04:21 +08:00
return FileSystem : : SetFilePermissions ( path , file_permissions ) ;
2013-11-21 05:07:01 +08:00
else
{
Error error ;
error . SetErrorStringWithFormat ( " remote platform %s doesn't support %s " , GetPluginName ( ) . GetCString ( ) , __PRETTY_FUNCTION__ ) ;
return error ;
}
}
2013-05-11 05:47:16 +08:00
ConstString
2011-04-12 13:54:46 +08:00
Platform : : GetName ( )
{
2013-11-21 05:07:01 +08:00
return GetPluginName ( ) ;
2011-04-12 13:54:46 +08:00
}
2011-03-24 12:28:38 +08:00
const char *
Platform : : GetHostname ( )
{
2011-04-14 06:47:15 +08:00
if ( IsHost ( ) )
2014-02-28 03:38:18 +08:00
return " 127.0.0.1 " ;
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
if ( m_name . empty ( ) )
return NULL ;
return m_name . c_str ( ) ;
2011-03-24 12:28:38 +08:00
}
2013-12-03 03:35:49 +08:00
bool
Platform : : SetRemoteWorkingDirectory ( const ConstString & path )
{
Log * log = GetLogIfAnyCategoriesSet ( LIBLLDB_LOG_PLATFORM ) ;
if ( log )
log - > Printf ( " Platform::SetRemoteWorkingDirectory('%s') " , path . GetCString ( ) ) ;
m_working_dir = path ;
return true ;
}
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
const char *
Platform : : GetUserName ( uint32_t uid )
{
2014-08-22 04:02:17 +08:00
# if !defined(LLDB_DISABLE_POSIX)
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
const char * user_name = GetCachedUserName ( uid ) ;
if ( user_name )
return user_name ;
if ( IsHost ( ) )
{
std : : string name ;
2014-08-22 04:02:17 +08:00
if ( HostInfo : : LookupUserName ( uid , name ) )
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
return SetCachedUserName ( uid , name . c_str ( ) , name . size ( ) ) ;
}
2014-08-22 04:02:17 +08:00
# endif
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
return NULL ;
}
2011-03-24 12:28:38 +08:00
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
const char *
Platform : : GetGroupName ( uint32_t gid )
{
2014-08-22 04:02:17 +08:00
# if !defined(LLDB_DISABLE_POSIX)
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
const char * group_name = GetCachedGroupName ( gid ) ;
if ( group_name )
return group_name ;
if ( IsHost ( ) )
{
std : : string name ;
2014-08-22 04:02:17 +08:00
if ( HostInfo : : LookupGroupName ( gid , name ) )
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
return SetCachedGroupName ( gid , name . c_str ( ) , name . size ( ) ) ;
}
2014-08-22 04:02:17 +08:00
# endif
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
return NULL ;
}
2011-03-24 12:28:38 +08:00
2011-03-19 09:12:21 +08:00
bool
Platform : : SetOSVersion ( uint32_t major ,
uint32_t minor ,
uint32_t update )
{
if ( IsHost ( ) )
{
2014-08-20 01:18:29 +08:00
// We don't need anyone setting the OS version for the host platform,
// we should be able to figure it out by calling HostInfo::GetOSVersion(...).
2011-03-19 09:12:21 +08:00
return false ;
}
else
{
// We have a remote platform, allow setting the target OS version if
// we aren't connected, since if we are connected, we should be able to
// request the remote OS version from the connected platform.
if ( IsConnected ( ) )
return false ;
else
{
// We aren't connected and we might want to set the OS version
// ahead of time before we connect so we can peruse files and
// use a local SDK or PDK cache of support files to disassemble
// or do other things.
m_major_os_version = major ;
m_minor_os_version = minor ;
m_update_os_version = update ;
return true ;
}
}
return false ;
}
2011-03-09 06:40:15 +08:00
Error
2014-11-18 03:39:20 +08:00
Platform : : ResolveExecutable ( const ModuleSpec & module_spec ,
2012-02-14 07:10:39 +08:00
lldb : : ModuleSP & exe_module_sp ,
const FileSpecList * module_search_paths_ptr )
2011-03-09 06:40:15 +08:00
{
Error error ;
2014-11-18 03:39:20 +08:00
if ( module_spec . GetFileSpec ( ) . Exists ( ) )
2011-03-09 06:40:15 +08:00
{
2012-02-26 13:51:37 +08:00
if ( module_spec . GetArchitecture ( ) . IsValid ( ) )
2011-03-09 06:40:15 +08:00
{
2012-02-26 13:51:37 +08:00
error = ModuleList : : GetSharedModule ( module_spec ,
2011-03-09 06:40:15 +08:00
exe_module_sp ,
2012-02-14 07:10:39 +08:00
module_search_paths_ptr ,
2011-03-09 06:40:15 +08:00
NULL ,
NULL ) ;
}
else
{
// No valid architecture was specified, ask the platform for
// the architectures that we should be using (in the correct order)
// and see if we can find a match that way
2014-11-18 03:39:20 +08:00
ModuleSpec arch_module_spec ( module_spec ) ;
for ( uint32_t idx = 0 ; GetSupportedArchitectureAtIndex ( idx , arch_module_spec . GetArchitecture ( ) ) ; + + idx )
2011-03-09 06:40:15 +08:00
{
2014-11-18 03:39:20 +08:00
error = ModuleList : : GetSharedModule ( arch_module_spec ,
2011-03-09 06:40:15 +08:00
exe_module_sp ,
2012-02-14 07:10:39 +08:00
module_search_paths_ptr ,
2011-03-09 06:40:15 +08:00
NULL ,
NULL ) ;
// Did we find an executable using one of the
if ( error . Success ( ) & & exe_module_sp )
break ;
}
}
}
else
{
2013-04-30 01:25:54 +08:00
error . SetErrorStringWithFormat ( " '%s' does not exist " ,
2014-11-18 03:39:20 +08:00
module_spec . GetFileSpec ( ) . GetPath ( ) . c_str ( ) ) ;
2011-03-09 06:40:15 +08:00
}
return error ;
}
2012-09-12 10:03:59 +08:00
Error
Platform : : ResolveSymbolFile ( Target & target ,
const ModuleSpec & sym_spec ,
FileSpec & sym_file )
{
Error error ;
if ( sym_spec . GetSymbolFileSpec ( ) . Exists ( ) )
sym_file = sym_spec . GetSymbolFileSpec ( ) ;
else
error . SetErrorString ( " unable to resolve symbol file " ) ;
return error ;
}
2011-08-12 00:25:18 +08:00
bool
Platform : : ResolveRemotePath ( const FileSpec & platform_path ,
FileSpec & resolved_platform_path )
{
resolved_platform_path = platform_path ;
return resolved_platform_path . ResolvePath ( ) ;
}
2011-03-19 09:12:21 +08:00
const ArchSpec &
Platform : : GetSystemArchitecture ( )
{
if ( IsHost ( ) )
{
if ( ! m_system_arch . IsValid ( ) )
{
// We have a local host platform
2014-08-21 00:42:51 +08:00
m_system_arch = HostInfo : : GetArchitecture ( ) ;
2011-03-19 09:12:21 +08:00
m_system_arch_set_while_connected = m_system_arch . IsValid ( ) ;
}
}
else
{
// We have a remote platform. We can only fetch the remote
// system architecture if we are connected, and we don't want to do it
// more than once.
const bool is_connected = IsConnected ( ) ;
bool fetch = false ;
if ( m_system_arch . IsValid ( ) )
{
// We have valid OS version info, check to make sure it wasn't
// manually set prior to connecting. If it was manually set prior
// to connecting, then lets fetch the actual OS version info
// if we are now connected.
if ( is_connected & & ! m_system_arch_set_while_connected )
fetch = true ;
}
else
{
// We don't have valid OS version info, fetch it if we are connected
fetch = is_connected ;
}
if ( fetch )
{
2011-03-24 12:28:38 +08:00
m_system_arch = GetRemoteSystemArchitecture ( ) ;
2011-03-19 09:12:21 +08:00
m_system_arch_set_while_connected = m_system_arch . IsValid ( ) ;
}
}
return m_system_arch ;
}
2011-03-09 06:40:15 +08:00
Error
2011-03-23 08:09:55 +08:00
Platform : : ConnectRemote ( Args & args )
2011-03-09 06:40:15 +08:00
{
Error error ;
2011-03-23 08:09:55 +08:00
if ( IsHost ( ) )
2013-05-11 05:47:16 +08:00
error . SetErrorStringWithFormat ( " The currently selected platform (%s) is the host platform and is always connected. " , GetPluginName ( ) . GetCString ( ) ) ;
2011-03-23 08:09:55 +08:00
else
2013-05-11 05:47:16 +08:00
error . SetErrorStringWithFormat ( " Platform::ConnectRemote() is not supported by %s " , GetPluginName ( ) . GetCString ( ) ) ;
2011-03-09 06:40:15 +08:00
return error ;
}
Error
2011-03-23 08:09:55 +08:00
Platform : : DisconnectRemote ( )
2011-03-09 06:40:15 +08:00
{
Error error ;
2011-03-23 08:09:55 +08:00
if ( IsHost ( ) )
2013-05-11 05:47:16 +08:00
error . SetErrorStringWithFormat ( " The currently selected platform (%s) is the host platform and is always connected. " , GetPluginName ( ) . GetCString ( ) ) ;
2011-03-23 08:09:55 +08:00
else
2013-05-11 05:47:16 +08:00
error . SetErrorStringWithFormat ( " Platform::DisconnectRemote() is not supported by %s " , GetPluginName ( ) . GetCString ( ) ) ;
2011-03-09 06:40:15 +08:00
return error ;
}
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
bool
2011-04-12 13:54:46 +08:00
Platform : : GetProcessInfo ( lldb : : pid_t pid , ProcessInstanceInfo & process_info )
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
{
// Take care of the host case so that each subclass can just
2011-04-12 13:54:46 +08:00
// call this function to get the host functionality.
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
if ( IsHost ( ) )
return Host : : GetProcessInfo ( pid , process_info ) ;
return false ;
}
uint32_t
2011-04-12 13:54:46 +08:00
Platform : : FindProcesses ( const ProcessInstanceInfoMatch & match_info ,
ProcessInstanceInfoList & process_infos )
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
{
2011-04-12 13:54:46 +08:00
// Take care of the host case so that each subclass can just
// call this function to get the host functionality.
Many improvements to the Platform base class and subclasses. The base Platform
class now implements the Host functionality for a lot of things that make
sense by default so that subclasses can check:
int
PlatformSubclass::Foo ()
{
if (IsHost())
return Platform::Foo (); // Let the platform base class do the host specific stuff
// Platform subclass specific code...
int result = ...
return result;
}
Added new functions to the platform:
virtual const char *Platform::GetUserName (uint32_t uid);
virtual const char *Platform::GetGroupName (uint32_t gid);
The user and group names are cached locally so that remote platforms can avoid
sending packets multiple times to resolve this information.
Added the parent process ID to the ProcessInfo class.
Added a new ProcessInfoMatch class which helps us to match processes up
and changed the Host layer over to using this new class. The new class allows
us to search for processs:
1 - by name (equal to, starts with, ends with, contains, and regex)
2 - by pid
3 - And further check for parent pid == value, uid == value, gid == value,
euid == value, egid == value, arch == value, parent == value.
This is all hookup up to the "platform process list" command which required
adding dumping routines to dump process information. If the Host class
implements the process lookup routines, you can now lists processes on
your local machine:
machine1.foo.com % lldb
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
94727 244 username usergroup username usergroup x86_64-apple-darwin Xcode
92742 92710 username usergroup username usergroup i386-apple-darwin debugserver
This of course also works remotely with the lldb-platform:
machine1.foo.com % lldb-platform --listen 1234
machine2.foo.com % lldb
(lldb) platform create remote-macosx
Platform: remote-macosx
Connected: no
(lldb) platform connect connect://localhost:1444
Platform: remote-macosx
Triple: x86_64-apple-darwin
OS Version: 10.6.7 (10J869)
Kernel: Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386
Hostname: machine1.foo.com
Connected: yes
(lldb) platform process list
PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE NAME
====== ====== ========== ========== ========== ========== ======================== ============================
99556 244 username usergroup username usergroup x86_64-apple-darwin trustevaluation
99548 65539 username usergroup username usergroup x86_64-apple-darwin lldb
99538 1 username usergroup username usergroup x86_64-apple-darwin FileMerge
94943 1 username usergroup username usergroup x86_64-apple-darwin mdworker
94852 244 username usergroup username usergroup x86_64-apple-darwin Safari
The lldb-platform implements everything with the Host:: layer, so this should
"just work" for linux. I will probably be adding more stuff to the Host layer
for launching processes and attaching to processes so that this support should
eventually just work as well.
Modified the target to be able to be created with an architecture that differs
from the main executable. This is needed for iOS debugging since we can have
an "armv6" binary which can run on an "armv7" machine, so we want to be able
to do:
% lldb
(lldb) platform create remote-ios
(lldb) file --arch armv7 a.out
Where "a.out" is an armv6 executable. The platform then can correctly decide
to open all "armv7" images for all dependent shared libraries.
Modified the disassembly to show the current PC value. Example output:
(lldb) disassemble --frame
a.out`main:
0x1eb7: pushl %ebp
0x1eb8: movl %esp, %ebp
0x1eba: pushl %ebx
0x1ebb: subl $20, %esp
0x1ebe: calll 0x1ec3 ; main + 12 at test.c:18
0x1ec3: popl %ebx
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
0x1edb: leal 213(%ebx), %eax
0x1ee1: movl %eax, (%esp)
0x1ee4: calll 0x1f1e ; puts
0x1ee9: calll 0x1f0c ; getchar
0x1eee: movl $20, (%esp)
0x1ef5: calll 0x1e6a ; sleep_loop at test.c:6
0x1efa: movl $12, %eax
0x1eff: addl $20, %esp
0x1f02: popl %ebx
0x1f03: leave
0x1f04: ret
This can be handy when dealing with the new --line options that was recently
added:
(lldb) disassemble --line
a.out`main + 13 at test.c:19
18 {
-> 19 printf("Process: %i\n\n", getpid());
20 puts("Press any key to continue..."); getchar();
-> 0x1ec4: calll 0x1f12 ; getpid
0x1ec9: movl %eax, 4(%esp)
0x1ecd: leal 199(%ebx), %eax
0x1ed3: movl %eax, (%esp)
0x1ed6: calll 0x1f18 ; printf
Modified the ModuleList to have a lookup based solely on a UUID. Since the
UUID is typically the MD5 checksum of a binary image, there is no need
to give the path and architecture when searching for a pre-existing
image in an image list.
Now that we support remote debugging a bit better, our lldb_private::Module
needs to be able to track what the original path for file was as the platform
knows it, as well as where the file is locally. The module has the two
following functions to retrieve both paths:
const FileSpec &Module::GetFileSpec () const;
const FileSpec &Module::GetPlatformFileSpec () const;
llvm-svn: 128563
2011-03-31 02:16:51 +08:00
uint32_t match_count = 0 ;
if ( IsHost ( ) )
match_count = Host : : FindProcesses ( match_info , process_infos ) ;
return match_count ;
}
2011-04-12 13:54:46 +08:00
Error
Platform : : LaunchProcess ( ProcessLaunchInfo & launch_info )
{
Error error ;
2014-10-09 09:02:08 +08:00
Log * log ( lldb_private : : GetLogIfAllCategoriesSet ( LIBLLDB_LOG_PLATFORM ) ) ;
if ( log )
log - > Printf ( " Platform::%s() " , __FUNCTION__ ) ;
// Take care of the host case so that each subclass can just
2011-04-12 13:54:46 +08:00
// call this function to get the host functionality.
if ( IsHost ( ) )
2012-03-27 07:03:23 +08:00
{
if ( : : getenv ( " LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY " ) )
launch_info . GetFlags ( ) . Set ( eLaunchFlagLaunchInTTY ) ;
if ( launch_info . GetFlags ( ) . Test ( eLaunchFlagLaunchInShell ) )
{
const bool is_localhost = true ;
2012-04-14 09:42:46 +08:00
const bool will_debug = launch_info . GetFlags ( ) . Test ( eLaunchFlagDebug ) ;
const bool first_arg_is_full_shell_command = false ;
2013-09-12 02:23:22 +08:00
uint32_t num_resumes = GetResumeCountForLaunchInfo ( launch_info ) ;
2014-10-09 09:02:08 +08:00
if ( log )
2014-10-21 01:46:43 +08:00
{
const FileSpec & shell = launch_info . GetShell ( ) ;
const char * shell_str = ( shell ) ? shell . GetPath ( ) . c_str ( ) : " <null> " ;
2014-10-09 09:02:08 +08:00
log - > Printf ( " Platform::%s GetResumeCountForLaunchInfo() returned % " PRIu32 " , shell is '%s' " ,
__FUNCTION__ ,
num_resumes ,
2014-10-21 01:46:43 +08:00
shell_str ) ;
}
2014-10-09 09:02:08 +08:00
2012-04-14 09:42:46 +08:00
if ( ! launch_info . ConvertArgumentsForLaunchingInShell ( error ,
is_localhost ,
will_debug ,
2013-09-10 10:09:47 +08:00
first_arg_is_full_shell_command ,
num_resumes ) )
2012-03-27 07:03:23 +08:00
return error ;
}
2015-02-21 06:20:30 +08:00
else if ( launch_info . GetFlags ( ) . Test ( eLaunchFlagShellExpandArguments ) )
2015-02-10 11:06:24 +08:00
{
2015-02-21 06:20:30 +08:00
error = ShellExpandArguments ( launch_info ) ;
2015-02-21 05:48:38 +08:00
if ( error . Fail ( ) )
2015-02-10 11:06:24 +08:00
return error ;
}
2012-03-27 07:03:23 +08:00
2014-10-09 09:02:08 +08:00
if ( log )
log - > Printf ( " Platform::%s final launch_info resume count: % " PRIu32 , __FUNCTION__ , launch_info . GetResumeCount ( ) ) ;
2011-04-12 13:54:46 +08:00
error = Host : : LaunchProcess ( launch_info ) ;
2012-03-27 07:03:23 +08:00
}
2011-04-12 13:54:46 +08:00
else
error . SetErrorString ( " base lldb_private::Platform class can't launch remote processes " ) ;
return error ;
}
2015-02-21 05:48:38 +08:00
Error
2015-02-21 06:20:30 +08:00
Platform : : ShellExpandArguments ( ProcessLaunchInfo & launch_info )
2015-02-21 05:48:38 +08:00
{
if ( IsHost ( ) )
2015-02-21 06:20:30 +08:00
return Host : : ShellExpandArguments ( launch_info ) ;
return Error ( " base lldb_private::Platform class can't expand arguments " ) ;
2015-02-21 05:48:38 +08:00
}
2015-02-05 07:19:15 +08:00
Error
Platform : : KillProcess ( const lldb : : pid_t pid )
{
Log * log ( lldb_private : : GetLogIfAllCategoriesSet ( LIBLLDB_LOG_PLATFORM ) ) ;
if ( log )
log - > Printf ( " Platform::%s, pid % " PRIu64 , __FUNCTION__ , pid ) ;
if ( ! IsHost ( ) )
return Error ( " base lldb_private::Platform class can't launch remote processes " ) ;
Host : : Kill ( pid , SIGTERM ) ;
return Error ( ) ;
}
2011-04-12 13:54:46 +08:00
lldb : : ProcessSP
Platform : : DebugProcess ( ProcessLaunchInfo & launch_info ,
Debugger & debugger ,
Target * target , // Can be NULL, if NULL create a new target, else use existing one
Error & error )
{
2014-10-09 09:02:08 +08:00
Log * log ( lldb_private : : GetLogIfAllCategoriesSet ( LIBLLDB_LOG_PLATFORM ) ) ;
if ( log )
log - > Printf ( " Platform::%s entered (target %p) " , __FUNCTION__ , static_cast < void * > ( target ) ) ;
2011-04-12 13:54:46 +08:00
ProcessSP process_sp ;
// Make sure we stop at the entry point
launch_info . GetFlags ( ) . Set ( eLaunchFlagDebug ) ;
2012-06-01 09:22:13 +08:00
// We always launch the process we are going to debug in a separate process
// group, since then we can handle ^C interrupts ourselves w/o having to worry
// about the target getting them as well.
launch_info . SetLaunchInSeparateProcessGroup ( true ) ;
2011-04-12 13:54:46 +08:00
error = LaunchProcess ( launch_info ) ;
if ( error . Success ( ) )
{
2014-10-09 09:02:08 +08:00
if ( log )
log - > Printf ( " Platform::%s LaunchProcess() call succeeded (pid=% " PRIu64 " ) " , __FUNCTION__ , launch_info . GetProcessID ( ) ) ;
2011-11-15 11:53:30 +08:00
if ( launch_info . GetProcessID ( ) ! = LLDB_INVALID_PROCESS_ID )
2011-04-12 13:54:46 +08:00
{
2011-11-15 11:53:30 +08:00
ProcessAttachInfo attach_info ( launch_info ) ;
2014-11-18 03:39:20 +08:00
process_sp = Attach ( attach_info , debugger , target , error ) ;
2011-11-17 12:46:02 +08:00
if ( process_sp )
{
2014-10-09 09:02:08 +08:00
if ( log )
log - > Printf ( " Platform::%s Attach() succeeded, Process plugin: %s " , __FUNCTION__ , process_sp - > GetPluginName ( ) . AsCString ( ) ) ;
2014-01-28 07:43:24 +08:00
launch_info . SetHijackListener ( attach_info . GetHijackListener ( ) ) ;
2011-11-17 12:46:02 +08:00
// Since we attached to the process, it will think it needs to detach
// if the process object just goes away without an explicit call to
// Process::Kill() or Process::Detach(), so let it know to kill the
// process if this happens.
process_sp - > SetShouldDetach ( false ) ;
2011-11-18 06:14:31 +08:00
// If we didn't have any file actions, the pseudo terminal might
// have been used where the slave side was given as the file to
// open for stdin/out/err after we have already opened the master
// so we can read/write stdin/out/err.
int pty_fd = launch_info . GetPTY ( ) . ReleaseMasterFileDescriptor ( ) ;
if ( pty_fd ! = lldb_utility : : PseudoTerminal : : invalid_fd )
{
process_sp - > SetSTDIOFileDescriptor ( pty_fd ) ;
}
2011-11-17 12:46:02 +08:00
}
2014-10-09 09:02:08 +08:00
else
{
if ( log )
log - > Printf ( " Platform::%s Attach() failed: %s " , __FUNCTION__ , error . AsCString ( ) ) ;
}
}
else
{
if ( log )
log - > Printf ( " Platform::%s LaunchProcess() returned launch_info with invalid process id " , __FUNCTION__ ) ;
2011-04-12 13:54:46 +08:00
}
}
2014-10-09 09:02:08 +08:00
else
{
if ( log )
log - > Printf ( " Platform::%s LaunchProcess() failed: %s " , __FUNCTION__ , error . AsCString ( ) ) ;
}
2011-04-12 13:54:46 +08:00
return process_sp ;
}
2012-03-21 02:34:04 +08:00
lldb : : PlatformSP
2012-05-08 09:45:38 +08:00
Platform : : GetPlatformForArchitecture ( const ArchSpec & arch , ArchSpec * platform_arch_ptr )
2012-03-21 02:34:04 +08:00
{
lldb : : PlatformSP platform_sp ;
Error error ;
if ( arch . IsValid ( ) )
2012-05-08 09:45:38 +08:00
platform_sp = Platform : : Create ( arch , platform_arch_ptr , error ) ;
2012-03-21 02:34:04 +08:00
return platform_sp ;
}
//------------------------------------------------------------------
/// Lets a platform answer if it is compatible with a given
/// architecture and the target triple contained within.
//------------------------------------------------------------------
bool
2013-01-12 04:49:54 +08:00
Platform : : IsCompatibleArchitecture ( const ArchSpec & arch , bool exact_arch_match , ArchSpec * compatible_arch_ptr )
2012-03-21 02:34:04 +08:00
{
// If the architecture is invalid, we must answer true...
2012-05-08 09:45:38 +08:00
if ( arch . IsValid ( ) )
2012-03-21 02:34:04 +08:00
{
2012-05-08 09:45:38 +08:00
ArchSpec platform_arch ;
2013-01-12 04:49:54 +08:00
// Try for an exact architecture match first.
if ( exact_arch_match )
2012-05-08 09:45:38 +08:00
{
2013-01-12 04:49:54 +08:00
for ( uint32_t arch_idx = 0 ; GetSupportedArchitectureAtIndex ( arch_idx , platform_arch ) ; + + arch_idx )
2012-05-08 09:45:38 +08:00
{
2013-01-12 04:49:54 +08:00
if ( arch . IsExactMatch ( platform_arch ) )
{
if ( compatible_arch_ptr )
* compatible_arch_ptr = platform_arch ;
return true ;
}
}
}
else
{
for ( uint32_t arch_idx = 0 ; GetSupportedArchitectureAtIndex ( arch_idx , platform_arch ) ; + + arch_idx )
{
if ( arch . IsCompatibleMatch ( platform_arch ) )
{
if ( compatible_arch_ptr )
* compatible_arch_ptr = platform_arch ;
return true ;
}
2012-05-08 09:45:38 +08:00
}
}
2012-03-21 02:34:04 +08:00
}
2012-05-08 09:45:38 +08:00
if ( compatible_arch_ptr )
compatible_arch_ptr - > Clear ( ) ;
2012-03-21 02:34:04 +08:00
return false ;
2013-08-27 07:57:52 +08:00
}
Error
Platform : : PutFile ( const FileSpec & source ,
const FileSpec & destination ,
uint32_t uid ,
uint32_t gid )
{
2015-01-22 06:42:49 +08:00
Log * log ( lldb_private : : GetLogIfAllCategoriesSet ( LIBLLDB_LOG_PLATFORM ) ) ;
if ( log )
log - > Printf ( " [PutFile] Using block by block transfer.... \n " ) ;
2015-02-18 00:07:52 +08:00
uint32_t source_open_options = File : : eOpenOptionRead | File : : eOpenOptionCloseOnExec ;
2015-01-22 06:42:49 +08:00
if ( source . GetFileType ( ) = = FileSpec : : eFileTypeSymbolicLink )
source_open_options | = File : : eOpenoptionDontFollowSymlinks ;
File source_file ( source , source_open_options , lldb : : eFilePermissionsUserRW ) ;
Error error ;
uint32_t permissions = source_file . GetPermissions ( error ) ;
if ( permissions = = 0 )
permissions = lldb : : eFilePermissionsFileDefault ;
if ( ! source_file . IsValid ( ) )
return Error ( " PutFile: unable to open source file " ) ;
lldb : : user_id_t dest_file = OpenFile ( destination ,
File : : eOpenOptionCanCreate |
File : : eOpenOptionWrite |
2015-02-18 00:07:52 +08:00
File : : eOpenOptionTruncate |
File : : eOpenOptionCloseOnExec ,
2015-01-22 06:42:49 +08:00
permissions ,
error ) ;
if ( log )
log - > Printf ( " dest_file = % " PRIu64 " \n " , dest_file ) ;
if ( error . Fail ( ) )
return error ;
if ( dest_file = = UINT64_MAX )
return Error ( " unable to open target file " ) ;
lldb : : DataBufferSP buffer_sp ( new DataBufferHeap ( 1024 , 0 ) ) ;
uint64_t offset = 0 ;
for ( ; ; )
{
size_t bytes_read = buffer_sp - > GetByteSize ( ) ;
error = source_file . Read ( buffer_sp - > GetBytes ( ) , bytes_read ) ;
if ( error . Fail ( ) | | bytes_read = = 0 )
break ;
const uint64_t bytes_written = WriteFile ( dest_file , offset ,
buffer_sp - > GetBytes ( ) , bytes_read , error ) ;
if ( error . Fail ( ) )
break ;
offset + = bytes_written ;
if ( bytes_written ! = bytes_read )
{
// We didn't write the correct number of bytes, so adjust
// the file position in the source file we are reading from...
source_file . SeekFromStart ( offset ) ;
}
}
CloseFile ( dest_file , error ) ;
if ( uid = = UINT32_MAX & & gid = = UINT32_MAX )
return error ;
// TODO: ChownFile?
2013-08-27 07:57:52 +08:00
return error ;
}
Error
Platform : : GetFile ( const FileSpec & source ,
const FileSpec & destination )
{
Error error ( " unimplemented " ) ;
return error ;
}
2013-11-21 05:07:01 +08:00
Error
Platform : : CreateSymlink ( const char * src , // The name of the link is in src
const char * dst ) // The symlink points to dst
{
Error error ( " unimplemented " ) ;
return error ;
}
2013-08-27 07:57:52 +08:00
bool
Platform : : GetFileExists ( const lldb_private : : FileSpec & file_spec )
{
return false ;
}
2013-11-21 05:07:01 +08:00
Error
Platform : : Unlink ( const char * path )
{
Error error ( " unimplemented " ) ;
return error ;
}
2013-08-27 07:57:52 +08:00
lldb_private : : Error
Platform : : RunShellCommand ( const char * command , // Shouldn't be NULL
const char * working_dir , // Pass NULL to use the current working directory
int * status_ptr , // Pass NULL if you don't want the process exit status
int * signo_ptr , // Pass NULL if you don't want the signal that caused the process to exit
std : : string * command_output , // Pass NULL if you don't want the command output
uint32_t timeout_sec ) // Timeout in seconds to wait for shell program to finish
{
if ( IsHost ( ) )
return Host : : RunShellCommand ( command , working_dir , status_ptr , signo_ptr , command_output , timeout_sec ) ;
else
return Error ( " unimplemented " ) ;
}
bool
Platform : : CalculateMD5 ( const FileSpec & file_spec ,
uint64_t & low ,
uint64_t & high )
{
if ( IsHost ( ) )
2014-08-16 06:04:21 +08:00
return FileSystem : : CalculateMD5 ( file_spec , low , high ) ;
2013-08-27 07:57:52 +08:00
else
return false ;
}
2014-07-01 05:05:18 +08:00
Error
Platform : : LaunchNativeProcess (
ProcessLaunchInfo & launch_info ,
lldb_private : : NativeProcessProtocol : : NativeDelegate & native_delegate ,
NativeProcessProtocolSP & process_sp )
{
// Platforms should override this implementation if they want to
// support lldb-gdbserver.
return Error ( " unimplemented " ) ;
}
Error
Platform : : AttachNativeProcess ( lldb : : pid_t pid ,
lldb_private : : NativeProcessProtocol : : NativeDelegate & native_delegate ,
NativeProcessProtocolSP & process_sp )
{
// Platforms should override this implementation if they want to
// support lldb-gdbserver.
return Error ( " unimplemented " ) ;
}
2013-08-27 07:57:52 +08:00
void
Platform : : SetLocalCacheDirectory ( const char * local )
{
m_local_cache_directory . assign ( local ) ;
}
const char *
Platform : : GetLocalCacheDirectory ( )
{
return m_local_cache_directory . c_str ( ) ;
}
static OptionDefinition
g_rsync_option_table [ ] =
{
2014-07-10 00:31:49 +08:00
{ LLDB_OPT_SET_ALL , false , " rsync " , ' r ' , OptionParser : : eNoArgument , NULL , NULL , 0 , eArgTypeNone , " Enable rsync. " } ,
{ LLDB_OPT_SET_ALL , false , " rsync-opts " , ' R ' , OptionParser : : eRequiredArgument , NULL , NULL , 0 , eArgTypeCommandName , " Platform-specific options required for rsync to work. " } ,
{ LLDB_OPT_SET_ALL , false , " rsync-prefix " , ' P ' , OptionParser : : eRequiredArgument , NULL , NULL , 0 , eArgTypeCommandName , " Platform-specific rsync prefix put before the remote path. " } ,
{ LLDB_OPT_SET_ALL , false , " ignore-remote-hostname " , ' i ' , OptionParser : : eNoArgument , NULL , NULL , 0 , eArgTypeNone , " Do not automatically fill in the remote hostname when composing the rsync command. " } ,
2013-08-27 07:57:52 +08:00
} ;
static OptionDefinition
g_ssh_option_table [ ] =
{
2014-07-10 00:31:49 +08:00
{ LLDB_OPT_SET_ALL , false , " ssh " , ' s ' , OptionParser : : eNoArgument , NULL , NULL , 0 , eArgTypeNone , " Enable SSH. " } ,
{ LLDB_OPT_SET_ALL , false , " ssh-opts " , ' S ' , OptionParser : : eRequiredArgument , NULL , NULL , 0 , eArgTypeCommandName , " Platform-specific options required for SSH to work. " } ,
2013-08-27 07:57:52 +08:00
} ;
static OptionDefinition
g_caching_option_table [ ] =
{
2014-07-10 00:31:49 +08:00
{ LLDB_OPT_SET_ALL , false , " local-cache-dir " , ' c ' , OptionParser : : eRequiredArgument , NULL , NULL , 0 , eArgTypePath , " Path in which to store local copies of files. " } ,
2013-08-27 07:57:52 +08:00
} ;
OptionGroupPlatformRSync : : OptionGroupPlatformRSync ( )
{
}
OptionGroupPlatformRSync : : ~ OptionGroupPlatformRSync ( )
{
}
const lldb_private : : OptionDefinition *
OptionGroupPlatformRSync : : GetDefinitions ( )
{
return g_rsync_option_table ;
}
void
OptionGroupPlatformRSync : : OptionParsingStarting ( CommandInterpreter & interpreter )
{
m_rsync = false ;
m_rsync_opts . clear ( ) ;
m_rsync_prefix . clear ( ) ;
m_ignores_remote_hostname = false ;
}
lldb_private : : Error
OptionGroupPlatformRSync : : SetOptionValue ( CommandInterpreter & interpreter ,
uint32_t option_idx ,
const char * option_arg )
{
Error error ;
char short_option = ( char ) GetDefinitions ( ) [ option_idx ] . short_option ;
switch ( short_option )
{
case ' r ' :
m_rsync = true ;
break ;
case ' R ' :
m_rsync_opts . assign ( option_arg ) ;
break ;
case ' P ' :
m_rsync_prefix . assign ( option_arg ) ;
break ;
case ' i ' :
m_ignores_remote_hostname = true ;
break ;
default :
error . SetErrorStringWithFormat ( " unrecognized option '%c' " , short_option ) ;
break ;
}
2012-03-21 02:34:04 +08:00
2013-08-27 07:57:52 +08:00
return error ;
2012-03-21 02:34:04 +08:00
}
2013-08-27 07:57:52 +08:00
uint32_t
OptionGroupPlatformRSync : : GetNumDefinitions ( )
{
return llvm : : array_lengthof ( g_rsync_option_table ) ;
}
2013-01-12 04:49:54 +08:00
2012-05-15 10:33:01 +08:00
lldb : : BreakpointSP
Platform : : SetThreadCreationBreakpoint ( lldb_private : : Target & target )
{
return lldb : : BreakpointSP ( ) ;
}
2012-03-21 02:34:04 +08:00
2013-08-27 07:57:52 +08:00
OptionGroupPlatformSSH : : OptionGroupPlatformSSH ( )
{
}
OptionGroupPlatformSSH : : ~ OptionGroupPlatformSSH ( )
{
}
const lldb_private : : OptionDefinition *
OptionGroupPlatformSSH : : GetDefinitions ( )
{
return g_ssh_option_table ;
}
void
OptionGroupPlatformSSH : : OptionParsingStarting ( CommandInterpreter & interpreter )
{
m_ssh = false ;
m_ssh_opts . clear ( ) ;
}
lldb_private : : Error
OptionGroupPlatformSSH : : SetOptionValue ( CommandInterpreter & interpreter ,
uint32_t option_idx ,
const char * option_arg )
{
Error error ;
char short_option = ( char ) GetDefinitions ( ) [ option_idx ] . short_option ;
switch ( short_option )
{
case ' s ' :
m_ssh = true ;
break ;
case ' S ' :
m_ssh_opts . assign ( option_arg ) ;
break ;
default :
error . SetErrorStringWithFormat ( " unrecognized option '%c' " , short_option ) ;
break ;
}
return error ;
}
uint32_t
OptionGroupPlatformSSH : : GetNumDefinitions ( )
{
return llvm : : array_lengthof ( g_ssh_option_table ) ;
}
OptionGroupPlatformCaching : : OptionGroupPlatformCaching ( )
{
}
OptionGroupPlatformCaching : : ~ OptionGroupPlatformCaching ( )
{
}
const lldb_private : : OptionDefinition *
OptionGroupPlatformCaching : : GetDefinitions ( )
{
return g_caching_option_table ;
}
void
OptionGroupPlatformCaching : : OptionParsingStarting ( CommandInterpreter & interpreter )
{
m_cache_dir . clear ( ) ;
}
lldb_private : : Error
OptionGroupPlatformCaching : : SetOptionValue ( CommandInterpreter & interpreter ,
uint32_t option_idx ,
const char * option_arg )
{
Error error ;
char short_option = ( char ) GetDefinitions ( ) [ option_idx ] . short_option ;
switch ( short_option )
{
case ' c ' :
m_cache_dir . assign ( option_arg ) ;
break ;
default :
error . SetErrorStringWithFormat ( " unrecognized option '%c' " , short_option ) ;
break ;
}
return error ;
}
uint32_t
OptionGroupPlatformCaching : : GetNumDefinitions ( )
{
return llvm : : array_lengthof ( g_caching_option_table ) ;
}
2012-08-23 01:17:09 +08:00
size_t
Platform : : GetEnvironment ( StringList & environment )
{
environment . Clear ( ) ;
return false ;
}
2014-02-14 07:11:45 +08:00
const std : : vector < ConstString > &
Platform : : GetTrapHandlerSymbolNames ( )
{
if ( ! m_calculated_trap_handlers )
{
2015-02-03 04:45:17 +08:00
Mutex : : Locker locker ( m_mutex ) ;
2014-05-24 07:11:27 +08:00
if ( ! m_calculated_trap_handlers )
{
CalculateTrapHandlerSymbolNames ( ) ;
m_calculated_trap_handlers = true ;
}
2014-02-14 07:11:45 +08:00
}
return m_trap_handlers ;
}
2015-03-14 02:44:56 +08:00
Error
Platform : : GetCachedExecutable ( ModuleSpec & module_spec ,
lldb : : ModuleSP & module_sp ,
const FileSpecList * module_search_paths_ptr ,
Platform & remote_platform )
{
const auto platform_spec = module_spec . GetFileSpec ( ) ;
const auto error = LoadCachedExecutable ( module_spec ,
module_sp ,
module_search_paths_ptr ,
remote_platform ) ;
if ( error . Success ( ) )
{
module_spec . GetFileSpec ( ) = module_sp - > GetFileSpec ( ) ;
module_spec . GetPlatformFileSpec ( ) = platform_spec ;
}
return error ;
}
Error
Platform : : LoadCachedExecutable ( const ModuleSpec & module_spec ,
lldb : : ModuleSP & module_sp ,
const FileSpecList * module_search_paths_ptr ,
Platform & remote_platform )
{
2015-03-25 07:45:49 +08:00
return GetRemoteSharedModule ( module_spec ,
nullptr ,
module_sp ,
[ & ] ( const ModuleSpec & spec )
{
return remote_platform . ResolveExecutable (
spec , module_sp , module_search_paths_ptr ) ;
} ,
nullptr ) ;
2015-03-14 02:44:56 +08:00
}
2015-03-25 07:45:49 +08:00
Error
Platform : : GetRemoteSharedModule ( const ModuleSpec & module_spec ,
2015-03-24 19:15:23 +08:00
Process * process ,
2015-03-25 07:45:49 +08:00
lldb : : ModuleSP & module_sp ,
const ModuleResolver & module_resolver ,
bool * did_create_ptr )
2015-03-10 09:15:28 +08:00
{
2015-03-25 07:45:49 +08:00
// Get module information from a target.
2015-03-10 09:15:28 +08:00
ModuleSpec resolved_module_spec ;
2015-03-24 19:15:23 +08:00
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 ) )
2015-03-25 07:45:49 +08:00
got_module_spec = true ;
2015-03-24 19:15:23 +08:00
}
if ( ! got_module_spec )
{
// Get module information from a target.
if ( ! GetModuleSpec ( module_spec . GetFileSpec ( ) , module_spec . GetArchitecture ( ) , resolved_module_spec ) )
2015-03-25 07:45:49 +08:00
return module_resolver ( module_spec ) ;
2015-03-24 19:15:23 +08:00
}
2015-03-10 09:15:28 +08:00
2015-03-25 07:45:49 +08:00
// Trying to find a module by UUID on local file system.
const auto error = module_resolver ( resolved_module_spec ) ;
if ( error . Fail ( ) )
{
if ( GetCachedSharedModule ( resolved_module_spec , module_sp , did_create_ptr ) )
return Error ( ) ;
}
return error ;
}
bool
Platform : : GetCachedSharedModule ( const ModuleSpec & module_spec ,
lldb : : ModuleSP & module_sp ,
bool * did_create_ptr )
{
if ( IsHost ( ) | |
! GetGlobalPlatformProperties ( ) - > GetUseModuleCache ( ) )
return false ;
Log * log = GetLogIfAnyCategoriesSet ( LIBLLDB_LOG_PLATFORM ) ;
2015-03-10 09:15:28 +08:00
// Check local cache for a module.
auto error = m_module_cache - > Get ( GetModuleCacheRoot ( ) ,
GetHostname ( ) ,
2015-03-25 07:45:49 +08:00
module_spec ,
module_sp ,
did_create_ptr ) ;
2015-03-10 09:15:28 +08:00
if ( error . Success ( ) )
return true ;
if ( log )
log - > Printf ( " Platform::%s - module %s not found in local cache: %s " ,
2015-03-25 07:45:49 +08:00
__FUNCTION__ , module_spec . GetUUID ( ) . GetAsString ( ) . c_str ( ) , error . AsCString ( ) ) ;
2015-03-10 09:15:28 +08:00
// Get temporary file name for a downloaded module.
llvm : : SmallString < PATH_MAX > tmp_download_file_path ;
const auto err_code = llvm : : sys : : fs : : createTemporaryFile (
2015-03-25 07:45:49 +08:00
" lldb " , module_spec . GetUUID ( ) . GetAsString ( ) . c_str ( ) , tmp_download_file_path ) ;
2015-03-10 09:15:28 +08:00
if ( err_code )
{
if ( log )
log - > Printf ( " Platform::%s - failed to create unique file: %s " ,
__FUNCTION__ , err_code . message ( ) . c_str ( ) ) ;
return false ;
}
llvm : : FileRemover tmp_file_remover ( tmp_download_file_path . c_str ( ) ) ;
const FileSpec tmp_download_file_spec ( tmp_download_file_path . c_str ( ) , true ) ;
// Download a module file.
2015-03-25 07:45:49 +08:00
error = DownloadModuleSlice ( module_spec . GetFileSpec ( ) ,
module_spec . GetObjectOffset ( ) ,
module_spec . GetObjectSize ( ) ,
2015-03-10 09:15:28 +08:00
tmp_download_file_spec ) ;
if ( error . Fail ( ) )
{
if ( log )
log - > Printf ( " Platform::%s - failed to download %s to %s: %s " ,
__FUNCTION__ , module_spec . GetFileSpec ( ) . GetPath ( ) . c_str ( ) ,
tmp_download_file_path . c_str ( ) , error . AsCString ( ) ) ;
return false ;
}
// Put downloaded file into local module cache.
error = m_module_cache - > Put ( GetModuleCacheRoot ( ) ,
GetHostname ( ) ,
2015-03-25 07:45:49 +08:00
module_spec ,
2015-03-10 09:15:28 +08:00
tmp_download_file_spec ) ;
if ( error . Fail ( ) )
{
if ( log )
log - > Printf ( " Platform::%s - failed to put module %s into cache: %s " ,
2015-03-25 07:45:49 +08:00
__FUNCTION__ , module_spec . GetUUID ( ) . GetAsString ( ) . c_str ( ) ,
2015-03-10 09:15:28 +08:00
error . AsCString ( ) ) ;
return false ;
}
error = m_module_cache - > Get ( GetModuleCacheRoot ( ) ,
GetHostname ( ) ,
2015-03-25 07:45:49 +08:00
module_spec ,
module_sp ,
did_create_ptr ) ;
2015-03-10 09:15:28 +08:00
return error . Success ( ) ;
}
Error
Platform : : DownloadModuleSlice ( const FileSpec & src_file_spec ,
const uint64_t src_offset ,
const uint64_t src_size ,
const FileSpec & dst_file_spec )
{
Error error ;
std : : ofstream dst ( dst_file_spec . GetPath ( ) , std : : ios : : out | std : : ios : : binary ) ;
if ( ! dst . is_open ( ) )
{
error . SetErrorStringWithFormat ( " unable to open destination file: %s " , dst_file_spec . GetPath ( ) . c_str ( ) ) ;
return error ;
}
auto src_fd = OpenFile ( src_file_spec ,
File : : eOpenOptionRead ,
lldb : : eFilePermissionsFileDefault ,
error ) ;
if ( error . Fail ( ) )
{
error . SetErrorStringWithFormat ( " unable to open source file: %s " , error . AsCString ( ) ) ;
return error ;
}
std : : vector < char > buffer ( 1024 ) ;
auto offset = src_offset ;
uint64_t total_bytes_read = 0 ;
while ( total_bytes_read < src_size )
{
const auto to_read = std : : min ( static_cast < uint64_t > ( buffer . size ( ) ) , src_size - total_bytes_read ) ;
const uint64_t n_read = ReadFile ( src_fd , offset , & buffer [ 0 ] , to_read , error ) ;
if ( error . Fail ( ) )
break ;
if ( n_read = = 0 )
{
error . SetErrorString ( " read 0 bytes " ) ;
break ;
}
offset + = n_read ;
total_bytes_read + = n_read ;
dst . write ( & buffer [ 0 ] , n_read ) ;
}
Error close_error ;
CloseFile ( src_fd , close_error ) ; // Ignoring close error.
return error ;
}
FileSpec
Platform : : GetModuleCacheRoot ( )
{
auto dir_spec = GetGlobalPlatformProperties ( ) - > GetModuleCacheDirectory ( ) ;
dir_spec . AppendPathComponent ( GetName ( ) . AsCString ( ) ) ;
return dir_spec ;
}