28using namespace std::chrono;
37 PlatformLinux::Initialize();
40#if defined(__ANDROID__)
42 default_platform_sp->SetSystemArchitecture(HostInfo::GetArchitecture());
59 PlatformLinux::Terminate();
65 const char *arch_name;
71 const char *triple_cstr =
72 arch ? arch->
GetTriple().getTriple().c_str() :
"<null>";
74 LLDB_LOGF(log,
"PlatformAndroid::%s(force=%s, arch={%s,%s})", __FUNCTION__,
75 force ?
"true" :
"false", arch_name, triple_cstr);
79 if (!create && arch && arch->
IsValid()) {
80 const llvm::Triple &triple = arch->
GetTriple();
81 switch (triple.getVendor()) {
82 case llvm::Triple::PC:
86#if defined(__ANDROID__)
90 case llvm::Triple::VendorType::UnknownVendor:
99 switch (triple.getEnvironment()) {
100 case llvm::Triple::Android:
103#if defined(__ANDROID__)
107 case llvm::Triple::EnvironmentType::UnknownEnvironment:
119 LLDB_LOGF(log,
"PlatformAndroid::%s() creating remote-android platform",
125 log,
"PlatformAndroid::%s() aborting creation of remote-android platform",
132 : PlatformLinux(is_host), m_sdk_version(0) {}
136 return "Local Android user platform plug-in.";
137 return "Remote Android user platform plug-in.";
144 return Status(
"can't connect to the host platform, always connected");
151 return Status(
"URL is null.");
152 std::optional<URI> parsed_url =
URI::Parse(url);
154 return Status(
"Invalid URL: %s", url);
155 if (parsed_url->hostname !=
"localhost")
158 auto error = PlatformLinux::ConnectRemote(args);
159 if (
error.Success()) {
173 return PlatformLinux::GetFile(source, destination);
185 uint32_t mode = 0, size = 0, mtime = 0;
186 error = sync_service->Stat(source_spec, mode, size, mtime);
191 return sync_service->PullFile(source_spec, destination);
193 std::string source_file = source_spec.
GetPath(
false);
196 LLDB_LOGF(log,
"Got mode == 0 on '%s': try to get file via 'shell cat'",
197 source_file.c_str());
199 if (strchr(source_file.c_str(),
'\'') !=
nullptr)
200 return Status(
"Doesn't support single-quotes in filenames");
207 snprintf(cmd,
sizeof(cmd),
"cat '%s'", source_file.c_str());
209 return adb.
ShellToFile(cmd, minutes(1), destination);
216 return PlatformLinux::PutFile(source, destination, uid, gid);
218 FileSpec destination_spec(destination.
GetPath(
false), FileSpec::Style::posix);
221 destination_spec.
GetPath(
false));
228 return sync_service->PushFile(source, destination_spec);
234 const uint64_t src_offset,
235 const uint64_t src_size,
238 return Status(
"Invalid offset - %" PRIu64, src_offset);
240 return GetFile(src_file_spec, dst_file_spec);
245 if (
error.Success()) {
263 std::string version_string;
266 adb.
Shell(
"getprop ro.build.version.sdk", seconds(5), &version_string);
267 version_string = llvm::StringRef(version_string).trim().str();
269 if (
error.Fail() || version_string.empty()) {
271 LLDB_LOGF(log,
"Get SDK version failed. (error: %s, output: %s)",
272 error.AsCString(), version_string.c_str());
284 llvm::StringRef extension = module_sp->GetFileSpec().GetFileNameExtension();
285 if (extension !=
".oat" && extension !=
".odex")
287 "Symbol file downloading only supported for oat and odex files");
290 if (!module_sp->GetPlatformFileSpec())
291 return Status(
"No platform file specified");
295 return Status(
"Symbol file generation only supported on SDK 23+");
298 if (module_sp->GetSectionList()->FindSectionByName(
ConstString(
".symtab")) !=
300 return Status(
"Symtab already available in the module");
305 seconds(5), &tmpdir);
306 if (
error.Fail() || tmpdir.empty())
307 return Status(
"Failed to generate temporary directory on the device (%s)",
309 tmpdir = llvm::StringRef(tmpdir).trim().str();
312 std::unique_ptr<std::string, std::function<void(std::string *)>>
313 tmpdir_remover(&tmpdir, [&adb](std::string *s) {
315 command.
Printf(
"rm -rf %s", s->c_str());
319 if (log &&
error.Fail())
320 LLDB_LOGF(log,
"Failed to remove temp directory: %s",
error.AsCString());
323 FileSpec symfile_platform_filespec(tmpdir);
324 symfile_platform_filespec.AppendPathComponent(
"symbolized.oat");
328 command.
Printf(
"oatdump --symbolize=%s --output=%s",
329 module_sp->GetPlatformFileSpec().GetPath(
false).c_str(),
330 symfile_platform_filespec.GetPath(
false).c_str());
333 return Status(
"Oatdump failed: %s",
error.AsCString());
336 return GetFile(symfile_platform_filespec, dst_file_spec);
347 std::vector<const char *> dl_open_names = {
"__dl_dlopen",
"dlopen" };
348 const char *dl_open_name =
nullptr;
350 for (
auto name: dl_open_names) {
352 ConstString(name), eFunctionNameTypeFull, matching_symbols);
353 if (matching_symbols.
GetSize()) {
359 if (dl_open_name == dl_open_names[0])
361 extern "C" void* dlopen(const char*, int) asm("__dl_dlopen");
362 extern "C" void* dlsym(void*, const char*) asm("__dl_dlsym");
363 extern "C" int dlclose(void*) asm("__dl_dlclose");
364 extern "C" char* dlerror(void) asm("__dl_dlerror");
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOGF(log,...)
#define LLDB_PLUGIN_DEFINE(PluginName)
An architecture specification class.
bool IsValid() const
Tests if this ArchSpec is valid.
llvm::Triple & GetTriple()
Architecture triple accessor.
bool TripleEnvironmentWasSpecified() const
bool TripleVendorWasSpecified() const
const char * GetArchitectureName() const
Returns a static string representing the current architecture.
A command line argument class.
const char * GetArgumentAtIndex(size_t idx) const
Gets the NULL terminated C string argument pointer for the argument at index idx.
A uniqued constant string class.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
FileSpec CopyByAppendingPathComponent(llvm::StringRef component) const
bool IsRelative() const
Returns true if the filespec represents a relative path.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
ConstString GetPathAsConstString(bool denormalize=true) const
Get the full path as a ConstString.
void FindFunctionSymbols(ConstString name, lldb::FunctionNameType name_type_mask, SymbolContextList &sc_list)
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
A plug-in interface definition class for debugging a process.
Target & GetTarget()
Get the target object pointer for this module.
const char * GetData() const
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Defines a list of symbol context objects.
uint32_t GetSize() const
Get accessor for a symbol context list size.
const ModuleList & GetImages() const
Get accessor for the images for this process.
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
static std::optional< URI > Parse(llvm::StringRef uri)