Author: eugene Date: Wed Jan 10 14:25:33 2018 New Revision: 322229 URL: http://llvm.org/viewvc/llvm-project?rev=322229&view=rev Log: Revert "Advanced guessing of rendezvous breakpoint"
This reverts commit r322209, because it broke TestNoreturnUnwind,TestInferiorAssert and TestNumThreads on i386. Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/global_constructor/TestBreakpointInGlobalConstructor.py lldb/trunk/packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/global_constructor/TestBreakpointInGlobalConstructor.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/global_constructor/TestBreakpointInGlobalConstructor.py?rev=322229&r1=322228&r2=322229&view=diff ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/global_constructor/TestBreakpointInGlobalConstructor.py (original) +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/global_constructor/TestBreakpointInGlobalConstructor.py Wed Jan 10 14:25:33 2018 @@ -17,23 +17,23 @@ class TestBreakpointInGlobalConstructors mydir = TestBase.compute_mydir(__file__) NO_DEBUG_INFO_TESTCASE = True - def test(self): - self.build() + def setUp(self): + TestBase.setUp(self) self.line_foo = line_number('foo.cpp', '// !BR_foo') self.line_main = line_number('main.cpp', '// !BR_main') - target = self.dbg.CreateTarget("a.out") - self.assertTrue(target, VALID_TARGET) - - env= self.registerSharedLibrariesWithTarget(target, ["foo"]) + @expectedFailureAll(bugnumber="llvm.org/pr35480", oslist=["linux"]) + def test(self): + self.build() + exe = os.path.join(os.getcwd(), "a.out") + self.runCmd("file %s" % exe) bp_main = lldbutil.run_break_set_by_file_and_line( self, 'main.cpp', self.line_main) bp_foo = lldbutil.run_break_set_by_file_and_line( self, 'foo.cpp', self.line_foo) - process = target.LaunchSimple( - None, env, self.get_process_working_directory()) + self.runCmd("run") self.assertIsNotNone( lldbutil.get_one_thread_stopped_at_breakpoint_id( Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py?rev=322229&r1=322228&r2=322229&view=diff ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py (original) +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py Wed Jan 10 14:25:33 2018 @@ -368,6 +368,7 @@ class LoadUnloadTestCase(TestBase): @skipIfFreeBSD # llvm.org/pr14424 - missing FreeBSD Makefiles/testcase support @skipIfWindows # Windows doesn't have dlopen and friends, dynamic libraries work differently + @unittest2.expectedFailure("llvm.org/pr25806") def test_static_init_during_load(self): """Test that we can set breakpoints correctly in static initializers""" @@ -394,19 +395,19 @@ class LoadUnloadTestCase(TestBase): self.runCmd("continue") self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, substrs=['stopped', - 'b_init', - 'stop reason = breakpoint %d' % b_init_bp_num]) + 'a_init', + 'stop reason = breakpoint %d' % a_init_bp_num]) self.expect("thread backtrace", - substrs=['b_init', + substrs=['a_init', 'dlopen', 'main']) self.runCmd("continue") self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, substrs=['stopped', - 'a_init', - 'stop reason = breakpoint %d' % a_init_bp_num]) + 'b_init', + 'stop reason = breakpoint %d' % b_init_bp_num]) self.expect("thread backtrace", - substrs=['a_init', + substrs=['b_init', 'dlopen', 'main']) Modified: lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp?rev=322229&r1=322228&r2=322229&view=diff ============================================================================== --- lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp (original) +++ lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp Wed Jan 10 14:25:33 2018 @@ -79,8 +79,7 @@ DynamicLoaderPOSIXDYLD::DynamicLoaderPOS : DynamicLoader(process), m_rendezvous(process), m_load_offset(LLDB_INVALID_ADDRESS), m_entry_point(LLDB_INVALID_ADDRESS), m_auxv(), m_dyld_bid(LLDB_INVALID_BREAK_ID), - m_vdso_base(LLDB_INVALID_ADDRESS), - m_interpreter_base(LLDB_INVALID_ADDRESS) {} + m_vdso_base(LLDB_INVALID_ADDRESS) {} DynamicLoaderPOSIXDYLD::~DynamicLoaderPOSIXDYLD() { if (m_dyld_bid != LLDB_INVALID_BREAK_ID) { @@ -118,7 +117,7 @@ void DynamicLoaderPOSIXDYLD::DidAttach() : "<null executable>", load_offset); - EvalSpecialModulesStatus(); + EvalVdsoStatus(); // if we dont have a load address we cant re-base bool rebase_exec = (load_offset == LLDB_INVALID_ADDRESS) ? false : true; @@ -208,7 +207,7 @@ void DynamicLoaderPOSIXDYLD::DidLaunch() executable = GetTargetExecutable(); load_offset = ComputeLoadOffset(); - EvalSpecialModulesStatus(); + EvalVdsoStatus(); if (executable.get() && load_offset != LLDB_INVALID_ADDRESS) { ModuleList module_list; @@ -218,12 +217,7 @@ void DynamicLoaderPOSIXDYLD::DidLaunch() if (log) log->Printf("DynamicLoaderPOSIXDYLD::%s about to call ProbeEntry()", __FUNCTION__); - - if (!SetRendezvousBreakpoint()) { - // If we cannot establish rendezvous breakpoint right now - // we'll try again at entry point. - ProbeEntry(); - } + ProbeEntry(); m_process->GetTarget().ModulesDidLoad(module_list); } @@ -335,77 +329,38 @@ bool DynamicLoaderPOSIXDYLD::EntryBreakp return false; // Continue running. } -bool DynamicLoaderPOSIXDYLD::SetRendezvousBreakpoint() { +void DynamicLoaderPOSIXDYLD::SetRendezvousBreakpoint() { Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DYNAMIC_LOADER)); - if (m_dyld_bid != LLDB_INVALID_BREAK_ID) { - LLDB_LOG(log, - "Rendezvous breakpoint breakpoint id {0} for pid {1}" - "is already set.", - m_dyld_bid, - m_process ? m_process->GetID() : LLDB_INVALID_PROCESS_ID); - return true; - } - addr_t break_addr; + addr_t break_addr = m_rendezvous.GetBreakAddress(); Target &target = m_process->GetTarget(); - BreakpointSP dyld_break; - if (m_rendezvous.IsValid()) { - break_addr = m_rendezvous.GetBreakAddress(); - LLDB_LOG(log, "Setting rendezvous break address for pid {0} at {1:x}", - m_process ? m_process->GetID() : LLDB_INVALID_PROCESS_ID, - break_addr); - dyld_break = target.CreateBreakpoint(break_addr, true, false); - } else { - LLDB_LOG(log, "Rendezvous structure is not set up yet. " - "Trying to locate rendezvous breakpoint in the interpreter " - "by symbol name."); - ModuleSP interpreter = LoadInterpreterModule(); - if (!interpreter) { - LLDB_LOG(log, "Can't find interpreter, rendezvous breakpoint isn't set."); - return false; - } - - // Function names from different dynamic loaders that are known - // to be used as rendezvous between the loader and debuggers. - static std::vector<std::string> DebugStateCandidates{ - "_dl_debug_state", "rtld_db_dlactivity", "__dl_rtld_db_dlactivity", - "r_debug_state", "_r_debug_state", "_rtld_debug_state", - }; - - FileSpecList containingModules; - containingModules.Append(interpreter->GetFileSpec()); - dyld_break = target.CreateBreakpoint( - &containingModules, nullptr /* containingSourceFiles */, - DebugStateCandidates, eFunctionNameTypeFull, eLanguageTypeC, - 0, /* offset */ - eLazyBoolNo, /* skip_prologue */ - true, /* internal */ - false /* request_hardware */); - } - - if (dyld_break->GetNumResolvedLocations() != 1) { - LLDB_LOG( - log, - "Rendezvous breakpoint has abnormal number of" - " resolved locations ({0}) in pid {1}. It's supposed to be exactly 1.", - dyld_break->GetNumResolvedLocations(), - m_process ? m_process->GetID() : LLDB_INVALID_PROCESS_ID); - target.RemoveBreakpointByID(dyld_break->GetID()); - return false; + if (m_dyld_bid == LLDB_INVALID_BREAK_ID) { + if (log) + log->Printf("DynamicLoaderPOSIXDYLD::%s pid %" PRIu64 + " setting rendezvous break address at 0x%" PRIx64, + __FUNCTION__, + m_process ? m_process->GetID() : LLDB_INVALID_PROCESS_ID, + break_addr); + Breakpoint *dyld_break = + target.CreateBreakpoint(break_addr, true, false).get(); + dyld_break->SetCallback(RendezvousBreakpointHit, this, true); + dyld_break->SetBreakpointKind("shared-library-event"); + m_dyld_bid = dyld_break->GetID(); + } else { + if (log) + log->Printf("DynamicLoaderPOSIXDYLD::%s pid %" PRIu64 + " reusing break id %" PRIu32 ", address at 0x%" PRIx64, + __FUNCTION__, + m_process ? m_process->GetID() : LLDB_INVALID_PROCESS_ID, + m_dyld_bid, break_addr); } - BreakpointLocationSP location = dyld_break->GetLocationAtIndex(0); - LLDB_LOG(log, - "Successfully set rendezvous breakpoint at address {0:x} " - "for pid {1}", - location->GetLoadAddress(), - m_process ? m_process->GetID() : LLDB_INVALID_PROCESS_ID); - - dyld_break->SetCallback(RendezvousBreakpointHit, this, true); - dyld_break->SetBreakpointKind("shared-library-event"); - m_dyld_bid = dyld_break->GetID(); - return true; + // Make sure our breakpoint is at the right address. + assert(target.GetBreakpointByID(m_dyld_bid) + ->FindLocationByAddress(break_addr) + ->GetBreakpoint() + .GetID() == m_dyld_bid); } bool DynamicLoaderPOSIXDYLD::RendezvousBreakpointHit( @@ -530,7 +485,7 @@ DynamicLoaderPOSIXDYLD::GetStepThroughTr return thread_plan_sp; } -void DynamicLoaderPOSIXDYLD::LoadVDSO() { +void DynamicLoaderPOSIXDYLD::LoadVDSO(ModuleList &modules) { if (m_vdso_base == LLDB_INVALID_ADDRESS) return; @@ -551,38 +506,13 @@ void DynamicLoaderPOSIXDYLD::LoadVDSO() } } -ModuleSP DynamicLoaderPOSIXDYLD::LoadInterpreterModule() { - if (m_interpreter_base == LLDB_INVALID_ADDRESS) - return nullptr; - - MemoryRegionInfo info; - Target &target = m_process->GetTarget(); - Status status = m_process->GetMemoryRegionInfo(m_interpreter_base, info); - if (status.Fail() || info.GetMapped() != MemoryRegionInfo::eYes || - info.GetName().IsEmpty()) { - Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DYNAMIC_LOADER)); - LLDB_LOG(log, "Failed to get interpreter region info: {0}", status); - return nullptr; - } - - FileSpec file(info.GetName().GetCString(), false); - ModuleSpec module_spec(file, target.GetArchitecture()); - - if (ModuleSP module_sp = target.GetSharedModule(module_spec)) { - UpdateLoadedSections(module_sp, LLDB_INVALID_ADDRESS, m_interpreter_base, - false); - return module_sp; - } - return nullptr; -} - void DynamicLoaderPOSIXDYLD::LoadAllCurrentModules() { DYLDRendezvous::iterator I; DYLDRendezvous::iterator E; ModuleList module_list; - Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DYNAMIC_LOADER)); if (!m_rendezvous.Resolve()) { + Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DYNAMIC_LOADER)); if (log) log->Printf("DynamicLoaderPOSIXDYLD::%s unable to resolve POSIX DYLD " "rendezvous address", @@ -594,7 +524,7 @@ void DynamicLoaderPOSIXDYLD::LoadAllCurr // that ourselves here. ModuleSP executable = GetTargetExecutable(); m_loaded_modules[executable] = m_rendezvous.GetLinkMapAddress(); - LoadVDSO(); + LoadVDSO(module_list); std::vector<FileSpec> module_names; for (I = m_rendezvous.begin(), E = m_rendezvous.end(); I != E; ++I) @@ -606,8 +536,6 @@ void DynamicLoaderPOSIXDYLD::LoadAllCurr ModuleSP module_sp = LoadModuleAtAddress(I->file_spec, I->link_addr, I->base_addr, true); if (module_sp.get()) { - LLDB_LOG(log, "LoadAllCurrentModules loading module: {0}", - I->file_spec.GetFilename()); module_list.Append(module_sp); } else { Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DYNAMIC_LOADER)); @@ -647,14 +575,11 @@ addr_t DynamicLoaderPOSIXDYLD::ComputeLo return m_load_offset; } -void DynamicLoaderPOSIXDYLD::EvalSpecialModulesStatus() { - auto I = m_auxv->FindEntry(AuxVector::AUXV_AT_SYSINFO_EHDR); - if (I != m_auxv->end() && I->value != 0) - m_vdso_base = I->value; +void DynamicLoaderPOSIXDYLD::EvalVdsoStatus() { + AuxVector::iterator I = m_auxv->FindEntry(AuxVector::AUXV_AT_SYSINFO_EHDR); - I = m_auxv->FindEntry(AuxVector::AUXV_AT_BASE); - if (I != m_auxv->end() && I->value != 0) - m_interpreter_base = I->value; + if (I != m_auxv->end()) + m_vdso_base = I->value; } addr_t DynamicLoaderPOSIXDYLD::GetEntryPoint() { Modified: lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h?rev=322229&r1=322228&r2=322229&view=diff ============================================================================== --- lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h (original) +++ lldb/trunk/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h Wed Jan 10 14:25:33 2018 @@ -85,17 +85,13 @@ protected: /// mapped to the address space lldb::addr_t m_vdso_base; - /// Contains AT_BASE, which means a dynamic loader has been - /// mapped to the address space - lldb::addr_t m_interpreter_base; - /// Loaded module list. (link map for each module) std::map<lldb::ModuleWP, lldb::addr_t, std::owner_less<lldb::ModuleWP>> m_loaded_modules; - /// If possible sets a breakpoint on a function called by the runtime + /// Enables a breakpoint on a function called by the runtime /// linker each time a module is loaded or unloaded. - bool SetRendezvousBreakpoint(); + virtual void SetRendezvousBreakpoint(); /// Callback routine which updates the current list of loaded modules based /// on the information supplied by the runtime linker. @@ -142,11 +138,7 @@ protected: /// of all dependent modules. virtual void LoadAllCurrentModules(); - void LoadVDSO(); - - // Loading an interpreter module (if present) assumming m_interpreter_base - // already points to its base address. - lldb::ModuleSP LoadInterpreterModule(); + void LoadVDSO(lldb_private::ModuleList &modules); /// Computes a value for m_load_offset returning the computed address on /// success and LLDB_INVALID_ADDRESS on failure. @@ -156,10 +148,9 @@ protected: /// success and LLDB_INVALID_ADDRESS on failure. lldb::addr_t GetEntryPoint(); - /// Evaluate if Aux vectors contain vDSO and LD information + /// Evaluate if Aux vectors contain vDSO information /// in case they do, read and assign the address to m_vdso_base - /// and m_interpreter_base. - void EvalSpecialModulesStatus(); + void EvalVdsoStatus(); /// Loads Module from inferior process. void ResolveExecutableModule(lldb::ModuleSP &module_sp); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits