Status PlatformAndroidRemoteGDBServer::ConnectRemote(Args &args) { m_device_id.clear(); if (args.GetArgumentCount() != 1) return Status( "\"platform connect\" takes a single argument: <connect-url>"); int remote_port; llvm::StringRef scheme, host, path; const char *url = args.GetArgumentAtIndex(0); if (!url) return Status("URL is null."); if (!UriParser::Parse(url, scheme, host, remote_port, path)) return Status("Invalid URL: %s", url); if (host != "localhost") m_device_id = host; m_socket_namespace.reset(); if (scheme == ConnectionFileDescriptor::UNIX_CONNECT_SCHEME) m_socket_namespace = AdbClient::UnixSocketNamespaceFileSystem; else if (scheme == ConnectionFileDescriptor::UNIX_ABSTRACT_CONNECT_SCHEME) m_socket_namespace = AdbClient::UnixSocketNamespaceAbstract; std::string connect_url; auto error = MakeConnectURL(g_remote_platform_pid, (remote_port < 0) ? 0 : remote_port, path, connect_url); if (error.Fail()) return error; args.ReplaceArgumentAtIndex(0, connect_url); Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PLATFORM)); if (log) log->Printf("Rewritten platform connect URL: %s", connect_url.c_str()); error = PlatformRemoteGDBServer::ConnectRemote(args); if (error.Fail()) DeleteForwardPort(g_remote_platform_pid); return error; }
Error PlatformAndroidRemoteGDBServer::ConnectRemote (Args& args) { m_device_id.clear(); if (args.GetArgumentCount() != 1) return Error("\"platform connect\" takes a single argument: <connect-url>"); int remote_port; std::string scheme, host, path; const char *url = args.GetArgumentAtIndex (0); if (!url) return Error("URL is null."); if (!UriParser::Parse (url, scheme, host, remote_port, path)) return Error("Invalid URL: %s", url); if (scheme == "adb") m_device_id = host; std::string connect_url; auto error = MakeConnectURL (g_remote_platform_pid, (remote_port < 0) ? 0 : remote_port, path.c_str (), connect_url); if (error.Fail ()) return error; args.ReplaceArgumentAtIndex (0, connect_url.c_str ()); Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PLATFORM)); if (log) log->Printf("Rewritten platform connect URL: %s", connect_url.c_str()); error = PlatformRemoteGDBServer::ConnectRemote(args); if (error.Fail ()) DeleteForwardPort (g_remote_platform_pid); return error; }
bool CommandObject::ExecuteWithOptions ( CommandInterpreter &interpreter, Args& args, CommandReturnObject &result ) { for (size_t i = 0; i < args.GetArgumentCount(); ++i) { const char *tmp_str = args.GetArgumentAtIndex (i); if (tmp_str[0] == '`') // back-quote args.ReplaceArgumentAtIndex (i, interpreter.ProcessEmbeddedScriptCommands (tmp_str)); } Process *process = interpreter.GetDebugger().GetExecutionContext().process; if (process == NULL) { if (GetFlags().IsSet(CommandObject::eFlagProcessMustBeLaunched | CommandObject::eFlagProcessMustBePaused)) { result.AppendError ("Process must exist."); result.SetStatus (eReturnStatusFailed); return false; } } else { StateType state = process->GetState(); switch (state) { case eStateAttaching: case eStateLaunching: case eStateSuspended: case eStateCrashed: case eStateStopped: break; case eStateDetached: case eStateExited: case eStateUnloaded: if (GetFlags().IsSet(CommandObject::eFlagProcessMustBeLaunched)) { result.AppendError ("Process must be launched."); result.SetStatus (eReturnStatusFailed); return false; } break; case eStateRunning: case eStateStepping: if (GetFlags().IsSet(CommandObject::eFlagProcessMustBePaused)) { result.AppendError ("Process is running. Use 'process interrupt' to pause execution."); result.SetStatus (eReturnStatusFailed); return false; } } } if (!ParseOptions (interpreter, args, result)) return false; // Call the command-specific version of 'Execute', passing it the already processed arguments. return Execute (interpreter, args, result); }