void POSIXThread::CrashNotify(const ProcessMessage &message) { // FIXME: Update stop reason as per bugzilla 14598 int signo = message.GetSignal(); assert(message.GetKind() == ProcessMessage::eCrashMessage); Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); if (log) log->Printf ("POSIXThread::%s () signo = %i, reason = '%s'", __FUNCTION__, signo, message.PrintCrashReason()); SetStopInfo (lldb::StopInfoSP(new POSIXCrashStopInfo(*this, signo, message.GetCrashReason(), message.GetFaultAddress()))); SetResumeSignal(signo); }
void ProcessKDP::DidAttach (ArchSpec &process_arch) { Process::DidAttach(process_arch); Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS)); if (log) log->Printf ("ProcessKDP::DidAttach()"); if (GetID() != LLDB_INVALID_PROCESS_ID) { uint32_t cpu = m_comm.GetCPUType(); if (cpu) { uint32_t sub = m_comm.GetCPUSubtype(); process_arch.SetArchitecture(eArchTypeMachO, cpu, sub); } } }
bool ThreadPlanCallFunction::MischiefManaged () { if (IsPlanComplete()) { Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP); if (log) log->Printf("Completed call function plan."); ThreadPlan::MischiefManaged (); return true; } else { return false; } }
void ResumeOperation::Execute(ProcessMonitor *monitor) { int data = 0; if (m_signo != LLDB_INVALID_SIGNAL_NUMBER) data = m_signo; if (PTRACE(PT_CONTINUE, m_tid, (caddr_t)1, data)) { Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS)); if (log) log->Printf ("ResumeOperation (%" PRIu64 ") failed: %s", m_tid, strerror(errno)); m_result = false; } else m_result = true; }
void NativeThreadLinux::MaybeLogStateChange (lldb::StateType new_state) { Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD)); // If we're not logging, we're done. if (!log) return; // If this is a state change to the same state, we're done. lldb::StateType old_state = m_state; if (new_state == old_state) return; NativeProcessProtocolSP m_process_sp = m_process_wp.lock (); lldb::pid_t pid = m_process_sp ? m_process_sp->GetID () : LLDB_INVALID_PROCESS_ID; // Log it. log->Printf ("NativeThreadLinux: thread (pid=%" PRIu64 ", tid=%" PRIu64 ") changing from state %s to %s", pid, GetID (), StateAsCString (old_state), StateAsCString (new_state)); }
void SBDebugger::Destroy (SBDebugger &debugger) { Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); if (log) { SBStream sstr; debugger.GetDescription (sstr); log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", static_cast<void*>(debugger.m_opaque_sp.get()), sstr.GetData()); } Debugger::Destroy (debugger.m_opaque_sp); if (debugger.m_opaque_sp.get() != NULL) debugger.m_opaque_sp.reset(); }
Error ProcessKDP::DoDetach(bool keep_stopped) { Error error; Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet(KDP_LOG_PROCESS)); if (log) log->Printf ("ProcessKDP::DoDetach(keep_stopped = %i)", keep_stopped); if (m_comm.IsRunning()) { // We are running and we can't interrupt a running kernel, so we need // to just close the connection to the kernel and hope for the best } else { DisableAllBreakpointSites (); m_thread_list.DiscardThreadPlans(); // If we are going to keep the target stopped, then don't send the disconnect message. if (!keep_stopped && m_comm.IsConnected()) { const bool success = m_comm.SendRequestDisconnect(); if (log) { if (success) log->PutCString ("ProcessKDP::DoDetach() detach packet sent successfully"); else log->PutCString ("ProcessKDP::DoDetach() connection channel shutdown failed"); } m_comm.Disconnect (); } } StopAsyncThread (); m_comm.Clear(); SetPrivateState (eStateDetached); ResumePrivateStateThread(); //KillDebugserverProcess (); return error; }
bool AllocatedMemoryCache::DeallocateMemory (lldb::addr_t addr) { Mutex::Locker locker (m_mutex); PermissionsToBlockMap::iterator pos, end = m_memory_map.end(); bool success = false; for (pos = m_memory_map.begin(); pos != end; ++pos) { if (pos->second->Contains (addr)) { success = pos->second->FreeBlock (addr); break; } } Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); if (log) log->Printf("AllocatedMemoryCache::DeallocateMemory (addr = 0x%16.16" PRIx64 ") => %i", (uint64_t)addr, success); return success; }
int32_t ThreadMacOSX::Resume() { Log *log = ProcessMacOSXLog::GetLogIfAllCategoriesSet(PD_LOG_THREAD); if (log && log->GetMask().IsSet(PD_LOG_VERBOSE)) log->Printf ("ThreadMacOSX::%s ()", __FUNCTION__); lldb::tid_t tid = GetID (); if (ThreadIDIsValid(tid)) { while (m_suspend_count > 0) { Error err(::thread_resume (tid), eErrorTypeMachKernel); if (err.Success()) m_suspend_count--; if (log || err.Fail()) err.PutToLog(log, "::thread_resume (%4.4x)", tid); } } return GetSuspendCount(); }
Error NativeRegisterContextLinux::DoReadRegisterValue(uint32_t offset, const char* reg_name, uint32_t size, RegisterValue &value) { Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_REGISTERS)); long data; Error error = NativeProcessLinux::PtraceWrapper( PTRACE_PEEKUSER, m_thread.GetID(), reinterpret_cast<void *>(offset), nullptr, 0, &data); if (error.Success()) // First cast to an unsigned of the same size to avoid sign extension. value.SetUInt64(static_cast<unsigned long>(data)); if (log) log->Printf ("NativeRegisterContextLinux::%s() reg %s: 0x%lx", __FUNCTION__, reg_name, data); return error; }
bool NativeThreadLinux::GetStopReason (ThreadStopInfo &stop_info, std::string& description) { Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD)); description.clear(); switch (m_state) { case eStateStopped: case eStateCrashed: case eStateExited: case eStateSuspended: case eStateUnloaded: if (log) LogThreadStopInfo (*log, m_stop_info, "m_stop_info in thread:"); stop_info = m_stop_info; description = m_stop_description; if (log) LogThreadStopInfo (*log, stop_info, "returned stop_info:"); return true; case eStateInvalid: case eStateConnected: case eStateAttaching: case eStateLaunching: case eStateRunning: case eStateStepping: case eStateDetached: if (log) { log->Printf ("NativeThreadLinux::%s tid %" PRIu64 " in state %s cannot answer stop reason", __FUNCTION__, GetID (), StateAsCString (m_state)); } return false; } llvm_unreachable("unhandled StateType!"); }
POSIXThread::POSIXThread(Process &process, lldb::tid_t tid) : Thread(process, tid), m_frame_ap() { Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); if (log && log->GetMask().Test(POSIX_LOG_VERBOSE)) log->Printf ("POSIXThread::%s (tid = %" PRIi64 ")", __FUNCTION__, tid); // Set the current watchpoints for this thread. Target &target = GetProcess()->GetTarget(); const WatchpointList &wp_list = target.GetWatchpointList(); size_t wp_size = wp_list.GetSize(); for (uint32_t wp_idx = 0; wp_idx < wp_size; wp_idx++) { lldb::WatchpointSP wp = wp_list.GetByIndex(wp_idx); if (wp.get() && wp->IsEnabled()) { assert(EnableHardwareWatchpoint(wp.get())); } } }
void POSIXThread::BreakNotify(const ProcessMessage &message) { bool status; Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); assert(GetRegisterContext()); status = GetPOSIXBreakpointProtocol()->UpdateAfterBreakpoint(); assert(status && "Breakpoint update failed!"); // With our register state restored, resolve the breakpoint object // corresponding to our current PC. assert(GetRegisterContext()); lldb::addr_t pc = GetRegisterContext()->GetPC(); if (log) log->Printf ("POSIXThread::%s () PC=0x%8.8" PRIx64, __FUNCTION__, pc); lldb::BreakpointSiteSP bp_site(GetProcess()->GetBreakpointSiteList().FindByAddress(pc)); // If the breakpoint is for this thread, then we'll report the hit, but if it is for another thread, // we create a stop reason with should_stop=false. If there is no breakpoint location, then report // an invalid stop reason. We don't need to worry about stepping over the breakpoint here, that will // be taken care of when the thread resumes and notices that there's a breakpoint under the pc. if (bp_site) { lldb::break_id_t bp_id = bp_site->GetID(); // If we have an operating system plug-in, we might have set a thread specific breakpoint using the // operating system thread ID, so we can't make any assumptions about the thread ID so we must always // report the breakpoint regardless of the thread. if (bp_site->ValidForThisThread(this) || GetProcess()->GetOperatingSystem () != NULL) SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID(*this, bp_id)); else { const bool should_stop = false; SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID(*this, bp_id, should_stop)); } } else SetStopInfo(StopInfoSP()); }
uint32_t PlatformRemoteAppleWatch::FindFileInAllSDKs(const char *platform_file_path, FileSpecList &file_list) { Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST | LIBLLDB_LOG_VERBOSE); if (platform_file_path && platform_file_path[0] && UpdateSDKDirectoryInfosIfNeeded()) { const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); lldb_private::FileSpec local_file; // First try for an exact match of major, minor and update for (uint32_t sdk_idx = 0; sdk_idx < num_sdk_infos; ++sdk_idx) { if (log) { log->Printf("Searching for %s in sdk path %s", platform_file_path, m_sdk_directory_infos[sdk_idx].directory.GetPath().c_str()); } if (GetFileInSDK(platform_file_path, sdk_idx, local_file)) { file_list.Append(local_file); } } } return file_list.GetSize(); }
// Overridden by FreeBSDThread; this is used only on Linux. void POSIXThread::RefreshStateAfterStop() { // Invalidate all registers in our register context. We don't set "force" to // true because the stop reply packet might have had some register values // that were expedited and these will already be copied into the register // context by the time this function gets called. The KDPRegisterContext // class has been made smart enough to detect when it needs to invalidate // which registers are valid by putting hooks in the register read and // register supply functions where they check the process stop ID and do // the right thing. //if (StateIsStoppedState(GetState()) { const bool force = false; GetRegisterContext()->InvalidateIfNeeded (force); } // FIXME: This should probably happen somewhere else. SetResumeState(eStateRunning, true); Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); if (log) log->Printf ("POSIXThread::%s (tid = %" PRIi64 ") setting thread resume state to running", __FUNCTION__, GetID()); }
void POSIXThread::WatchNotify(const ProcessMessage &message) { Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); lldb::addr_t halt_addr = message.GetHWAddress(); if (log) log->Printf ("POSIXThread::%s () Hardware Watchpoint Address = 0x%8.8" PRIx64, __FUNCTION__, halt_addr); POSIXBreakpointProtocol* reg_ctx = GetPOSIXBreakpointProtocol(); if (reg_ctx) { uint32_t num_hw_wps = reg_ctx->NumSupportedHardwareWatchpoints(); uint32_t wp_idx; for (wp_idx = 0; wp_idx < num_hw_wps; wp_idx++) { if (reg_ctx->IsWatchpointHit(wp_idx)) { // Clear the watchpoint hit here reg_ctx->ClearWatchpointHits(); break; } } if (wp_idx == num_hw_wps) return; Target &target = GetProcess()->GetTarget(); lldb::addr_t wp_monitor_addr = reg_ctx->GetWatchpointAddress(wp_idx); const WatchpointList &wp_list = target.GetWatchpointList(); lldb::WatchpointSP wp_sp = wp_list.FindByAddress(wp_monitor_addr); assert(wp_sp.get() && "No watchpoint found"); SetStopInfo (StopInfo::CreateStopReasonWithWatchpointID(*this, wp_sp->GetID())); } }
lldb::RegisterContextSP POSIXThread::CreateRegisterContextForFrame(lldb_private::StackFrame *frame) { lldb::RegisterContextSP reg_ctx_sp; uint32_t concrete_frame_idx = 0; Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); if (log && log->GetMask().Test(POSIX_LOG_VERBOSE)) log->Printf ("POSIXThread::%s ()", __FUNCTION__); if (frame) concrete_frame_idx = frame->GetConcreteFrameIndex(); if (concrete_frame_idx == 0) reg_ctx_sp = GetRegisterContext(); else { assert(GetUnwinder()); reg_ctx_sp = GetUnwinder()->CreateRegisterContextForFrame(frame); } return reg_ctx_sp; }
uint32_t Listener::StartListeningForEvents (Broadcaster* broadcaster, uint32_t event_mask, HandleBroadcastCallback callback, void *callback_user_data) { if (broadcaster) { // Scope for "locker" // Tell the broadcaster to add this object as a listener { Mutex::Locker locker(m_broadcasters_mutex); m_broadcasters.insert(std::make_pair(broadcaster, BroadcasterInfo(event_mask, callback, callback_user_data))); } uint32_t acquired_mask = broadcaster->AddListener (this, event_mask); Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EVENTS); if (log) log->Printf ("%p Listener::StartListeningForEvents (broadcaster = %p, mask = 0x%8.8x, callback = %p, user_data = %p) acquired_mask = 0x%8.8x for %s", this, broadcaster, event_mask, callback, callback_user_data, acquired_mask, m_name.c_str()); return acquired_mask; } return 0; }
lldb_private::ConstString PlatformRemoteGDBServer::GetRemoteWorkingDirectory() { if (IsConnected()) { Log *log = GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PLATFORM); std::string cwd; if (m_gdb_client.GetWorkingDir(cwd)) { ConstString working_dir(cwd.c_str()); if (log) log->Printf("PlatformRemoteGDBServer::GetRemoteWorkingDirectory() -> '%s'", working_dir.GetCString()); return working_dir; } else { return ConstString(); } } else { return Platform::GetRemoteWorkingDirectory(); } }
bool POSIXThread::Resume() { lldb::StateType resume_state = GetResumeState(); ProcessMonitor &monitor = GetMonitor(); bool status; Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); if (log) log->Printf ("POSIXThread::%s (), resume_state = %s", __FUNCTION__, StateAsCString(resume_state)); switch (resume_state) { default: assert(false && "Unexpected state for resume!"); status = false; break; case lldb::eStateRunning: SetState(resume_state); status = monitor.Resume(GetID(), GetResumeSignal()); break; case lldb::eStateStepping: SetState(resume_state); status = monitor.SingleStep(GetID(), GetResumeSignal()); break; case lldb::eStateStopped: case lldb::eStateSuspended: status = true; break; } return status; }
bool ThreadPlanStepThroughObjCTrampoline::ShouldStop (Event *event_ptr) { if (m_func_sp.get() == NULL || m_thread.IsThreadPlanDone(m_func_sp.get())) { m_func_sp.reset(); if (!m_run_to_sp) { Value target_addr_value; ExecutionContext exc_context; m_thread.Calculate(exc_context); m_impl_function->FetchFunctionResults (exc_context, m_args_addr, target_addr_value); m_impl_function->DeallocateFunctionResults(exc_context, m_args_addr); lldb::addr_t target_addr = target_addr_value.GetScalar().ULongLong(); Address target_address(NULL, target_addr); Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP); if (log) log->Printf("Running to ObjC method implementation: 0x%llx", target_addr); m_objc_trampoline_handler->AddToCache (m_class_ptr, m_sel_ptr, target_addr); // Extract the target address from the value: m_run_to_sp.reset(new ThreadPlanRunToAddress(m_thread, target_address, m_stop_others)); m_thread.QueueThreadPlan(m_run_to_sp, false); m_run_to_sp->SetPrivate(true); return false; } else if (m_thread.IsThreadPlanDone(m_run_to_sp.get())) { SetPlanComplete(); return true; } } return false; }
Error PlatformRemoteiOS::GetSharedModule (const ModuleSpec &module_spec, Process* process, ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr, ModuleSP *old_module_sp_ptr, bool *did_create_ptr) { // For iOS, the SDK files are all cached locally on the host // system. So first we ask for the file in the cached SDK, // then we attempt to get a shared module for the right architecture // with the right UUID. const FileSpec &platform_file = module_spec.GetFileSpec(); Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST | LIBLLDB_LOG_VERBOSE); Error error; char platform_file_path[PATH_MAX]; if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path))) { ModuleSpec platform_module_spec(module_spec); UpdateSDKDirectoryInfosIfNeeded(); const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); // If we are connected we migth be able to correctly deduce the SDK directory // using the OS build. const uint32_t connected_sdk_idx = GetConnectedSDKIndex (); if (connected_sdk_idx < num_sdk_infos) { if (log) { log->Printf ("Searching for %s in sdk path %s", platform_file_path, m_sdk_directory_infos[connected_sdk_idx].directory.GetPath().c_str()); } if (GetFileInSDK (platform_file_path, connected_sdk_idx, platform_module_spec.GetFileSpec())) { module_sp.reset(); error = ResolveExecutable (platform_module_spec, module_sp, NULL); if (module_sp) { m_last_module_sdk_idx = connected_sdk_idx; error.Clear(); return error; } } } // Try the last SDK index if it is set as most files from an SDK // will tend to be valid in that same SDK. if (m_last_module_sdk_idx < num_sdk_infos) { if (log) { log->Printf ("Searching for %s in sdk path %s", platform_file_path, m_sdk_directory_infos[m_last_module_sdk_idx].directory.GetPath().c_str()); } if (GetFileInSDK (platform_file_path, m_last_module_sdk_idx, platform_module_spec.GetFileSpec())) { module_sp.reset(); error = ResolveExecutable (platform_module_spec, module_sp, NULL); if (module_sp) { error.Clear(); return error; } } } // First try for an exact match of major, minor and update: // If a particalar SDK version was specified via --version or --build, look for a match on disk. const SDKDirectoryInfo *current_sdk_info = GetSDKDirectoryForCurrentOSVersion(); const uint32_t current_sdk_idx = GetSDKIndexBySDKDirectoryInfo(current_sdk_info); if (current_sdk_idx < num_sdk_infos && current_sdk_idx != m_last_module_sdk_idx) { if (log) { log->Printf ("Searching for %s in sdk path %s", platform_file_path, m_sdk_directory_infos[current_sdk_idx].directory.GetPath().c_str()); } if (GetFileInSDK (platform_file_path, current_sdk_idx, platform_module_spec.GetFileSpec())) { module_sp.reset(); error = ResolveExecutable (platform_module_spec, module_sp, NULL); if (module_sp) { m_last_module_sdk_idx = current_sdk_idx; error.Clear(); return error; } } } // Second try all SDKs that were found. for (uint32_t sdk_idx=0; sdk_idx<num_sdk_infos; ++sdk_idx) { if (m_last_module_sdk_idx == sdk_idx) { // Skip the last module SDK index if we already searched // it above continue; } if (log) { log->Printf ("Searching for %s in sdk path %s", platform_file_path, m_sdk_directory_infos[sdk_idx].directory.GetPath().c_str()); } if (GetFileInSDK (platform_file_path, sdk_idx, platform_module_spec.GetFileSpec())) { //printf ("sdk[%u]: '%s'\n", sdk_idx, local_file.GetPath().c_str()); error = ResolveExecutable (platform_module_spec, module_sp, NULL); if (module_sp) { // Remember the index of the last SDK that we found a file // in in case the wrong SDK was selected. m_last_module_sdk_idx = sdk_idx; error.Clear(); return error; } } } } // Not the module we are looking for... Nothing to see here... module_sp.reset(); // This may not be an SDK-related module. Try whether we can bring in the thing to our local cache. error = GetSharedModuleWithLocalCache(module_spec, module_sp, module_search_paths_ptr, old_module_sp_ptr, did_create_ptr); if (error.Success()) return error; const bool always_create = false; error = ModuleList::GetSharedModule (module_spec, module_sp, module_search_paths_ptr, old_module_sp_ptr, did_create_ptr, always_create); if (module_sp) module_sp->SetPlatformFileSpec(platform_file); return error; }
WindowImpl::WindowImpl (const DeviceManagerPtr& device_manager, INativeWindow& window, const common::PropertyMap& properties, const SettingsPtr& settings, const CacheManagerPtr& cache_manager) { try { Log log; log.Printf ("Creating render window"); //заполнение параметров цепочки обмена low_level::SwapChainDesc swap_chain_desc; memset (&swap_chain_desc, 0, sizeof swap_chain_desc); swap_chain_desc.frame_buffer.color_bits = get_uint_property (properties, "ColorBits", 0); swap_chain_desc.frame_buffer.alpha_bits = get_uint_property (properties, "AlphaBits", 0); swap_chain_desc.frame_buffer.depth_bits = get_uint_property (properties, "DepthBits", 0); swap_chain_desc.frame_buffer.stencil_bits = get_uint_property (properties, "StencilBits", 0); swap_chain_desc.samples_count = get_uint_property (properties, "SamplesCount", 0); swap_chain_desc.buffers_count = get_uint_property (properties, "BuffersCount", 2); swap_chain_desc.swap_method = SwapMethod_Discard; swap_chain_desc.vsync = get_uint_property (properties, "VSync", 0) != 0; swap_chain_desc.fullscreen = get_uint_property (properties, "FullScreen", 0) != 0; const char* swap_method_name = get_string_property (properties, "SwapMethod", (const char*)0); if (swap_method_name) { if (!xtl::xstricmp ("Flip", swap_method_name)) swap_chain_desc.swap_method = SwapMethod_Flip; else if (!xtl::xstricmp ("Copy", swap_method_name)) swap_chain_desc.swap_method = SwapMethod_Copy; else if (!xtl::xstricmp ("Discard", swap_method_name)) swap_chain_desc.swap_method = SwapMethod_Discard; else { throw xtl::make_argument_exception ("", "properties ['SwapMethod']", swap_method_name); } } //создание цепочки обмена impl = new Impl (this, settings); impl->native_window = &window; impl->swap_chain_desc = swap_chain_desc; if (!device_manager) { const char *driver_mask = get_string_property (properties, "DriverMask", "*"), *adapter_mask = get_string_property (properties, "AdapterMask", "*"), *init_string = get_string_property (properties, "InitString", ""); log.Printf ("Create device manager (driver='%s', adapter='%s', init_string='%s')", driver_mask, adapter_mask, init_string); LowLevelDevicePtr device; LowLevelDriverPtr driver; swap_chain_desc.window_handle = window.GetHandle (); low_level::DriverManager::CreateSwapChainAndDevice (driver_mask, adapter_mask, swap_chain_desc, init_string, impl->swap_chain, device, driver); if (!device) throw xtl::format_operation_exception ("", "Null device after render::low_level::DriverManager::CreateSwapChainAndDevice"); if (!driver) throw xtl::format_operation_exception ("", "Null driver after render::low_level::DriverManager::CreateSwapChainAndDevice"); if (!impl->swap_chain) throw xtl::format_operation_exception ("", "Null swap chain after render::low_level::DriverManager::CreateSwapChainAndDevice"); LowLevelAdapterPtr adapter = impl->swap_chain->GetAdapter (); if (!adapter) throw xtl::format_operation_exception ("", "Null adapter after render::low_level::DriverManager::CreateSwapChainAndDevice"); impl->device_manager = DeviceManagerPtr (new render::manager::DeviceManager (device, driver, settings, cache_manager), false); impl->adapter = impl->swap_chain->GetAdapter (); log.Printf ("...device manager and swap chain have been successfully created"); } else { const char* adapter_mask = get_string_property (properties, "AdapterMask", "*"); impl->device_manager = device_manager; log.Printf ("Creating swap chain (adapter='%s')", adapter_mask); impl->CreateSwapChain (window.GetHandle (), adapter_mask); } //обновление размеров impl->UpdateSizes (window.GetWidth (), window.GetHeight ()); //подписка на события окна window.AttachListener (impl.get ()); //создание целей рендеринга impl->CreateRenderTargets (); } catch (xtl::exception& e) { e.touch ("render::manager::WindowImpl::WindowImpl"); throw; } }
bool PlatformRemoteiOS::GetFileInSDKRoot (const char *platform_file_path, const char *sdkroot_path, bool symbols_dirs_only, lldb_private::FileSpec &local_file) { Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); if (sdkroot_path && sdkroot_path[0] && platform_file_path && platform_file_path[0]) { char resolved_path[PATH_MAX]; if (!symbols_dirs_only) { ::snprintf (resolved_path, sizeof(resolved_path), "%s%s", sdkroot_path, platform_file_path); local_file.SetFile(resolved_path, true); if (local_file.Exists()) { if (log) { log->Printf ("Found a copy of %s in the SDK dir %s", platform_file_path, sdkroot_path); } return true; } } ::snprintf (resolved_path, sizeof(resolved_path), "%s/Symbols.Internal%s", sdkroot_path, platform_file_path); local_file.SetFile(resolved_path, true); if (local_file.Exists()) { if (log) { log->Printf ("Found a copy of %s in the SDK dir %s/Symbols.Internal", platform_file_path, sdkroot_path); } return true; } ::snprintf (resolved_path, sizeof(resolved_path), "%s/Symbols%s", sdkroot_path, platform_file_path); local_file.SetFile(resolved_path, true); if (local_file.Exists()) { if (log) { log->Printf ("Found a copy of %s in the SDK dir %s/Symbols", platform_file_path, sdkroot_path); } return true; } } return false; }
Error PlatformRemoteiOS::GetSymbolFile (const FileSpec &platform_file, const UUID *uuid_ptr, FileSpec &local_file) { Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); Error error; char platform_file_path[PATH_MAX]; if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path))) { char resolved_path[PATH_MAX]; const char * os_version_dir = GetDeviceSupportDirectoryForOSVersion(); if (os_version_dir) { ::snprintf (resolved_path, sizeof(resolved_path), "%s/%s", os_version_dir, platform_file_path); local_file.SetFile(resolved_path, true); if (local_file.Exists()) { if (log) { log->Printf ("Found a copy of %s in the DeviceSupport dir %s", platform_file_path, os_version_dir); } return error; } ::snprintf (resolved_path, sizeof(resolved_path), "%s/Symbols.Internal/%s", os_version_dir, platform_file_path); local_file.SetFile(resolved_path, true); if (local_file.Exists()) { if (log) { log->Printf ("Found a copy of %s in the DeviceSupport dir %s/Symbols.Internal", platform_file_path, os_version_dir); } return error; } ::snprintf (resolved_path, sizeof(resolved_path), "%s/Symbols/%s", os_version_dir, platform_file_path); local_file.SetFile(resolved_path, true); if (local_file.Exists()) { if (log) { log->Printf ("Found a copy of %s in the DeviceSupport dir %s/Symbols", platform_file_path, os_version_dir); } return error; } } local_file = platform_file; if (local_file.Exists()) return error; error.SetErrorStringWithFormat ("unable to locate a platform file for '%s' in platform '%s'", platform_file_path, GetPluginName().GetCString()); } else { error.SetErrorString ("invalid platform file argument"); } return error; }
bool PlatformRemoteiOS::UpdateSDKDirectoryInfosIfNeeded() { Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); if (m_sdk_directory_infos.empty()) { // A --sysroot option was supplied - add it to our list of SDKs to check if (m_sdk_sysroot) { FileSpec sdk_sysroot_fspec(m_sdk_sysroot.GetCString(), true); const SDKDirectoryInfo sdk_sysroot_directory_info(sdk_sysroot_fspec); m_sdk_directory_infos.push_back(sdk_sysroot_directory_info); if (log) { log->Printf ("PlatformRemoteiOS::UpdateSDKDirectoryInfosIfNeeded added --sysroot SDK directory %s", m_sdk_sysroot.GetCString()); } return true; } const char *device_support_dir = GetDeviceSupportDirectory(); if (log) { log->Printf ("PlatformRemoteiOS::UpdateSDKDirectoryInfosIfNeeded Got DeviceSupport directory %s", device_support_dir); } if (device_support_dir) { const bool find_directories = true; const bool find_files = false; const bool find_other = false; SDKDirectoryInfoCollection builtin_sdk_directory_infos; FileSpec::EnumerateDirectory (m_device_support_directory.c_str(), find_directories, find_files, find_other, GetContainedFilesIntoVectorOfStringsCallback, &builtin_sdk_directory_infos); // Only add SDK directories that have symbols in them, some SDKs only contain // developer disk images and no symbols, so they aren't useful to us. FileSpec sdk_symbols_symlink_fspec; for (const auto &sdk_directory_info : builtin_sdk_directory_infos) { sdk_symbols_symlink_fspec = sdk_directory_info.directory; sdk_symbols_symlink_fspec.AppendPathComponent("Symbols"); if (sdk_symbols_symlink_fspec.Exists()) { m_sdk_directory_infos.push_back(sdk_directory_info); if (log) { log->Printf ("PlatformRemoteiOS::UpdateSDKDirectoryInfosIfNeeded added builtin SDK directory %s", sdk_symbols_symlink_fspec.GetPath().c_str()); } } } const uint32_t num_installed = m_sdk_directory_infos.size(); FileSpec local_sdk_cache("~/Library/Developer/Xcode/iOS DeviceSupport", true); if (local_sdk_cache.Exists()) { if (log) { log->Printf ("PlatformRemoteiOS::UpdateSDKDirectoryInfosIfNeeded searching %s for additional SDKs", local_sdk_cache.GetPath().c_str()); } char path[PATH_MAX]; if (local_sdk_cache.GetPath(path, sizeof(path))) { FileSpec::EnumerateDirectory (path, find_directories, find_files, find_other, GetContainedFilesIntoVectorOfStringsCallback, &m_sdk_directory_infos); const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); // First try for an exact match of major, minor and update for (uint32_t i=num_installed; i<num_sdk_infos; ++i) { m_sdk_directory_infos[i].user_cached = true; if (log) { log->Printf ("PlatformRemoteiOS::UpdateSDKDirectoryInfosIfNeeded user SDK directory %s", m_sdk_directory_infos[i].directory.GetPath().c_str()); } } } } } } return !m_sdk_directory_infos.empty(); }
Error PlatformRemoteAppleWatch::GetSharedModule( const ModuleSpec &module_spec, lldb_private::Process *process, ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr, ModuleSP *old_module_sp_ptr, bool *did_create_ptr) { // For Apple Watch, the SDK files are all cached locally on the host // system. So first we ask for the file in the cached SDK, // then we attempt to get a shared module for the right architecture // with the right UUID. const FileSpec &platform_file = module_spec.GetFileSpec(); Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST | LIBLLDB_LOG_VERBOSE); Error error; char platform_file_path[PATH_MAX]; if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path))) { ModuleSpec platform_module_spec(module_spec); UpdateSDKDirectoryInfosIfNeeded(); const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); // If we are connected we migth be able to correctly deduce the SDK // directory // using the OS build. const uint32_t connected_sdk_idx = GetConnectedSDKIndex(); if (connected_sdk_idx < num_sdk_infos) { if (log) { log->Printf("Searching for %s in sdk path %s", platform_file_path, m_sdk_directory_infos[connected_sdk_idx] .directory.GetPath() .c_str()); } if (GetFileInSDK(platform_file_path, connected_sdk_idx, platform_module_spec.GetFileSpec())) { module_sp.reset(); error = ResolveExecutable(platform_module_spec, module_sp, nullptr); if (module_sp) { m_last_module_sdk_idx = connected_sdk_idx; error.Clear(); return error; } } } // Try the last SDK index if it is set as most files from an SDK // will tend to be valid in that same SDK. if (m_last_module_sdk_idx < num_sdk_infos) { if (log) { log->Printf("Searching for %s in sdk path %s", platform_file_path, m_sdk_directory_infos[m_last_module_sdk_idx] .directory.GetPath() .c_str()); } if (GetFileInSDK(platform_file_path, m_last_module_sdk_idx, platform_module_spec.GetFileSpec())) { module_sp.reset(); error = ResolveExecutable(platform_module_spec, module_sp, nullptr); if (module_sp) { error.Clear(); return error; } } } // First try for an exact match of major, minor and update for (uint32_t sdk_idx = 0; sdk_idx < num_sdk_infos; ++sdk_idx) { if (m_last_module_sdk_idx == sdk_idx) { // Skip the last module SDK index if we already searched // it above continue; } if (log) { log->Printf("Searching for %s in sdk path %s", platform_file_path, m_sdk_directory_infos[sdk_idx].directory.GetPath().c_str()); } if (GetFileInSDK(platform_file_path, sdk_idx, platform_module_spec.GetFileSpec())) { // printf ("sdk[%u]: '%s'\n", sdk_idx, local_file.GetPath().c_str()); error = ResolveExecutable(platform_module_spec, module_sp, nullptr); if (module_sp) { // Remember the index of the last SDK that we found a file // in in case the wrong SDK was selected. m_last_module_sdk_idx = sdk_idx; error.Clear(); return error; } } } } // Not the module we are looking for... Nothing to see here... module_sp.reset(); // This may not be an SDK-related module. Try whether we can bring in the // thing to our local cache. error = GetSharedModuleWithLocalCache(module_spec, module_sp, module_search_paths_ptr, old_module_sp_ptr, did_create_ptr); if (error.Success()) return error; // See if the file is present in any of the module_search_paths_ptr // directories. if (!module_sp && module_search_paths_ptr && platform_file) { // create a vector of all the file / directory names in platform_file // e.g. this might be // /System/Library/PrivateFrameworks/UIFoundation.framework/UIFoundation // // We'll need to look in the module_search_paths_ptr directories for // both "UIFoundation" and "UIFoundation.framework" -- most likely the // latter will be the one we find there. FileSpec platform_pull_apart(platform_file); std::vector<std::string> path_parts; ConstString unix_root_dir("/"); while (true) { ConstString part = platform_pull_apart.GetLastPathComponent(); platform_pull_apart.RemoveLastPathComponent(); if (part.IsEmpty() || part == unix_root_dir) break; path_parts.push_back(part.AsCString()); } const size_t path_parts_size = path_parts.size(); size_t num_module_search_paths = module_search_paths_ptr->GetSize(); for (size_t i = 0; i < num_module_search_paths; ++i) { // Create a new FileSpec with this module_search_paths_ptr // plus just the filename ("UIFoundation"), then the parent // dir plus filename ("UIFoundation.framework/UIFoundation") // etc - up to four names (to handle "Foo.framework/Contents/MacOS/Foo") for (size_t j = 0; j < 4 && j < path_parts_size - 1; ++j) { FileSpec path_to_try(module_search_paths_ptr->GetFileSpecAtIndex(i)); // Add the components backwards. For // .../PrivateFrameworks/UIFoundation.framework/UIFoundation // path_parts is // [0] UIFoundation // [1] UIFoundation.framework // [2] PrivateFrameworks // // and if 'j' is 2, we want to append path_parts[1] and then // path_parts[0], aka // 'UIFoundation.framework/UIFoundation', to the module_search_paths_ptr // path. for (int k = j; k >= 0; --k) { path_to_try.AppendPathComponent(path_parts[k]); } if (path_to_try.Exists()) { ModuleSpec new_module_spec(module_spec); new_module_spec.GetFileSpec() = path_to_try; Error new_error(Platform::GetSharedModule( new_module_spec, process, module_sp, NULL, old_module_sp_ptr, did_create_ptr)); if (module_sp) { module_sp->SetPlatformFileSpec(path_to_try); return new_error; } } } } } const bool always_create = false; error = ModuleList::GetSharedModule( module_spec, module_sp, module_search_paths_ptr, old_module_sp_ptr, did_create_ptr, always_create); if (module_sp) module_sp->SetPlatformFileSpec(platform_file); return error; }
bool ValueObjectSynthetic::UpdateValue() { Log *log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS); SetValueIsValid(false); m_error.Clear(); if (!m_parent->UpdateValueIfNeeded(false)) { // our parent could not update.. as we are meaningless without a parent, // just stop if (m_parent->GetError().Fail()) m_error = m_parent->GetError(); return false; } // regenerate the synthetic filter if our typename changes // <rdar://problem/12424824> ConstString new_parent_type_name = m_parent->GetTypeName(); if (new_parent_type_name != m_parent_type_name) { if (log) log->Printf("[ValueObjectSynthetic::UpdateValue] name=%s, type changed " "from %s to %s, recomputing synthetic filter", GetName().AsCString(), m_parent_type_name.AsCString(), new_parent_type_name.AsCString()); m_parent_type_name = new_parent_type_name; CreateSynthFilter(); } // let our backend do its update if (m_synth_filter_ap->Update() == false) { if (log) log->Printf("[ValueObjectSynthetic::UpdateValue] name=%s, synthetic " "filter said caches are stale - clearing", GetName().AsCString()); // filter said that cached values are stale m_children_byindex.Clear(); m_name_toindex.Clear(); // usually, an object's value can change but this does not alter its // children count // for a synthetic VO that might indeed happen, so we need to tell the upper // echelons // that they need to come back to us asking for children m_children_count_valid = false; m_synthetic_children_cache.Clear(); m_synthetic_children_count = UINT32_MAX; m_might_have_children = eLazyBoolCalculate; } else { if (log) log->Printf("[ValueObjectSynthetic::UpdateValue] name=%s, synthetic " "filter said caches are still valid", GetName().AsCString()); } m_provides_value = eLazyBoolCalculate; lldb::ValueObjectSP synth_val(m_synth_filter_ap->GetSyntheticValue()); if (synth_val && synth_val->CanProvideValue()) { if (log) log->Printf("[ValueObjectSynthetic::UpdateValue] name=%s, synthetic " "filter said it can provide a value", GetName().AsCString()); m_provides_value = eLazyBoolYes; CopyValueData(synth_val.get()); } else { if (log) log->Printf("[ValueObjectSynthetic::UpdateValue] name=%s, synthetic " "filter said it will not provide a value", GetName().AsCString()); m_provides_value = eLazyBoolNo; CopyValueData(m_parent); } SetValueIsValid(true); return true; }
Error ProcessFreeBSD::EnableWatchpoint(Watchpoint *wp, bool notify) { Error error; if (wp) { user_id_t watchID = wp->GetID(); addr_t addr = wp->GetLoadAddress(); Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_WATCHPOINTS)); if (log) log->Printf ("ProcessFreeBSD::EnableWatchpoint(watchID = %" PRIu64 ")", watchID); if (wp->IsEnabled()) { if (log) log->Printf("ProcessFreeBSD::EnableWatchpoint(watchID = %" PRIu64 ") addr = 0x%8.8" PRIx64 ": watchpoint already enabled.", watchID, (uint64_t)addr); return error; } // Try to find a vacant watchpoint slot in the inferiors' main thread uint32_t wp_hw_index = LLDB_INVALID_INDEX32; Mutex::Locker lock(m_thread_list.GetMutex()); FreeBSDThread *thread = static_cast<FreeBSDThread*>( m_thread_list.GetThreadAtIndex(0, false).get()); if (thread) wp_hw_index = thread->FindVacantWatchpointIndex(); if (wp_hw_index == LLDB_INVALID_INDEX32) { error.SetErrorString("Setting hardware watchpoint failed."); } else { wp->SetHardwareIndex(wp_hw_index); bool wp_enabled = true; uint32_t thread_count = m_thread_list.GetSize(false); for (uint32_t i = 0; i < thread_count; ++i) { thread = static_cast<FreeBSDThread*>( m_thread_list.GetThreadAtIndex(i, false).get()); if (thread) wp_enabled &= thread->EnableHardwareWatchpoint(wp); else wp_enabled = false; } if (wp_enabled) { wp->SetEnabled(true, notify); return error; } else { // Watchpoint enabling failed on at least one // of the threads so roll back all of them DisableWatchpoint(wp, false); error.SetErrorString("Setting hardware watchpoint failed"); } } } else error.SetErrorString("Watchpoint argument was NULL."); return error; }
bool PlatformRemoteDarwinDevice::UpdateSDKDirectoryInfosIfNeeded() { Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); std::lock_guard<std::mutex> guard(m_sdk_dir_mutex); if (m_sdk_directory_infos.empty()) { // A --sysroot option was supplied - add it to our list of SDKs to check if (m_sdk_sysroot) { FileSpec sdk_sysroot_fspec(m_sdk_sysroot.GetCString()); FileSystem::Instance().Resolve(sdk_sysroot_fspec); const SDKDirectoryInfo sdk_sysroot_directory_info(sdk_sysroot_fspec); m_sdk_directory_infos.push_back(sdk_sysroot_directory_info); if (log) { log->Printf("PlatformRemoteDarwinDevice::UpdateSDKDirectoryInfosIfNeeded added " "--sysroot SDK directory %s", m_sdk_sysroot.GetCString()); } return true; } const char *device_support_dir = GetDeviceSupportDirectory(); if (log) { log->Printf("PlatformRemoteDarwinDevice::UpdateSDKDirectoryInfosIfNeeded Got " "DeviceSupport directory %s", device_support_dir); } if (device_support_dir) { const bool find_directories = true; const bool find_files = false; const bool find_other = false; SDKDirectoryInfoCollection builtin_sdk_directory_infos; FileSystem::Instance().EnumerateDirectory( m_device_support_directory, find_directories, find_files, find_other, GetContainedFilesIntoVectorOfStringsCallback, &builtin_sdk_directory_infos); // Only add SDK directories that have symbols in them, some SDKs only // contain developer disk images and no symbols, so they aren't useful to // us. FileSpec sdk_symbols_symlink_fspec; for (const auto &sdk_directory_info : builtin_sdk_directory_infos) { sdk_symbols_symlink_fspec = sdk_directory_info.directory; sdk_symbols_symlink_fspec.AppendPathComponent("Symbols"); if (FileSystem::Instance().Exists(sdk_symbols_symlink_fspec)) { m_sdk_directory_infos.push_back(sdk_directory_info); if (log) { log->Printf("PlatformRemoteDarwinDevice::UpdateSDKDirectoryInfosIfNeeded " "added builtin SDK directory %s", sdk_symbols_symlink_fspec.GetPath().c_str()); } } } std::vector<std::string> device_support_dirnames; GetDeviceSupportDirectoryNames (device_support_dirnames); for (std::string &dirname : device_support_dirnames) { const uint32_t num_installed = m_sdk_directory_infos.size(); std::string local_sdk_cache_str = "~/Library/Developer/Xcode/"; local_sdk_cache_str += dirname; FileSpec local_sdk_cache(local_sdk_cache_str.c_str()); FileSystem::Instance().Resolve(local_sdk_cache); if (FileSystem::Instance().Exists(local_sdk_cache)) { if (log) { log->Printf("PlatformRemoteDarwinDevice::UpdateSDKDirectoryInfosIfNeeded " "searching %s for additional SDKs", local_sdk_cache.GetPath().c_str()); } char path[PATH_MAX]; if (local_sdk_cache.GetPath(path, sizeof(path))) { FileSystem::Instance().EnumerateDirectory( path, find_directories, find_files, find_other, GetContainedFilesIntoVectorOfStringsCallback, &m_sdk_directory_infos); const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); // First try for an exact match of major, minor and update for (uint32_t i = num_installed; i < num_sdk_infos; ++i) { m_sdk_directory_infos[i].user_cached = true; if (log) { log->Printf("PlatformRemoteDarwinDevice::UpdateSDKDirectoryInfosIfNeeded " "user SDK directory %s", m_sdk_directory_infos[i].directory.GetPath().c_str()); } } } } } const char *addtional_platform_dirs = getenv("PLATFORM_SDK_DIRECTORY"); if (addtional_platform_dirs) { SDKDirectoryInfoCollection env_var_sdk_directory_infos; FileSystem::Instance().EnumerateDirectory( addtional_platform_dirs, find_directories, find_files, find_other, GetContainedFilesIntoVectorOfStringsCallback, &env_var_sdk_directory_infos); FileSpec sdk_symbols_symlink_fspec; for (const auto &sdk_directory_info : env_var_sdk_directory_infos) { sdk_symbols_symlink_fspec = sdk_directory_info.directory; sdk_symbols_symlink_fspec.AppendPathComponent("Symbols"); if (FileSystem::Instance().Exists(sdk_symbols_symlink_fspec)) { m_sdk_directory_infos.push_back(sdk_directory_info); if (log) { log->Printf("PlatformRemoteDarwinDevice::UpdateSDKDirectoryInfosIfNeeded " "added env var SDK directory %s", sdk_symbols_symlink_fspec.GetPath().c_str()); } } } } } } return !m_sdk_directory_infos.empty(); }