diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h @@ -158,6 +158,8 @@ bool LoadPlatformBinaryAndSetup(Process *process, lldb::addr_t addr, bool notify) override; + void UpdateKextandKernelsLocalScan(); + // Most of the ivars are assembled under FileSystem::EnumerateDirectory calls // where the function being called for each file/directory must be static. // We'll pass a this pointer as a baton and access the ivars directly. @@ -194,6 +196,8 @@ LazyBool m_ios_debug_session; + std::once_flag m_kext_scan_flag; + PlatformDarwinKernel(const PlatformDarwinKernel &) = delete; const PlatformDarwinKernel &operator=(const PlatformDarwinKernel &) = delete; }; diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp @@ -229,12 +229,8 @@ m_name_to_kext_path_map_without_dsyms(), m_search_directories(), m_search_directories_no_recursing(), m_kernel_binaries_with_dsyms(), m_kernel_binaries_without_dsyms(), m_kernel_dsyms_no_binaries(), - m_kernel_dsyms_yaas(), m_ios_debug_session(is_ios_debug_session) - -{ - CollectKextAndKernelDirectories(); - SearchForKextsAndKernelsRecursively(); -} + m_kernel_dsyms_yaas(), m_ios_debug_session(is_ios_debug_session), + m_kext_scan_flag() {} /// Destructor. /// @@ -243,6 +239,7 @@ PlatformDarwinKernel::~PlatformDarwinKernel() = default; void PlatformDarwinKernel::GetStatus(Stream &strm) { + UpdateKextandKernelsLocalScan(); Platform::GetStatus(strm); strm.Printf(" Debug session type: "); if (m_ios_debug_session == eLazyBoolYes) @@ -709,6 +706,13 @@ return results; } +void PlatformDarwinKernel::UpdateKextandKernelsLocalScan() { + std::call_once(m_kext_scan_flag, [this]() { + CollectKextAndKernelDirectories(); + SearchForKextsAndKernelsRecursively(); + }); +} + Status PlatformDarwinKernel::GetSharedModule( const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr, @@ -789,6 +793,7 @@ llvm::SmallVectorImpl *old_modules, bool *did_create_ptr) { Status error; module_sp.reset(); + UpdateKextandKernelsLocalScan(); // First try all kernel binaries that have a dSYM next to them for (auto possible_kernel : m_kernel_binaries_with_dsyms) {