Author: ted Date: Mon Sep 10 11:19:01 2018 New Revision: 341849 URL: http://llvm.org/viewvc/llvm-project?rev=341849&view=rev Log: Fix raw address breakpoints not resolving
Summary: An address breakpoint of the form "b 0x1000" won't resolve if it's created while the process isn't running. This patch deletes Address::SectionWasDeleted, renames Address::SectionWasDeletedPrivate to SectionWasDeleted (and makes it public), and changes the section check in Breakpoint::ModulesChanged back to its original form Reviewers: jingham, #lldb Reviewed By: jingham Subscribers: davide, lldb-commits Differential Revision: https://reviews.llvm.org/D51816 Modified: lldb/trunk/include/lldb/Core/Address.h lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py lldb/trunk/source/Breakpoint/Breakpoint.cpp lldb/trunk/source/Core/Address.cpp Modified: lldb/trunk/include/lldb/Core/Address.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Address.h?rev=341849&r1=341848&r2=341849&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/Address.h (original) +++ lldb/trunk/include/lldb/Core/Address.h Mon Sep 10 11:19:01 2018 @@ -525,11 +525,11 @@ public: bool CalculateSymbolContextLineEntry(LineEntry &line_entry) const; //------------------------------------------------------------------ - // Returns true if the section should be valid, but isn't because the shared - // pointer to the section can't be reconstructed from a weak pointer that - // contains a valid weak reference to a section. Returns false if the section - // weak pointer has no reference to a section, or if the section is still - // valid + // Returns true if the m_section_wp once had a reference to a valid section + // shared pointer, but no longer does. This can happen if we have an address + // from a module that gets unloaded and deleted. This function should only be + // called if GetSection() returns an empty shared pointer and you want to + // know if this address used to have a valid section. //------------------------------------------------------------------ bool SectionWasDeleted() const; @@ -539,15 +539,6 @@ protected: //------------------------------------------------------------------ lldb::SectionWP m_section_wp; ///< The section for the address, can be NULL. lldb::addr_t m_offset; ///< Offset into section if \a m_section_wp is valid... - - //------------------------------------------------------------------ - // Returns true if the m_section_wp once had a reference to a valid section - // shared pointer, but no longer does. This can happen if we have an address - // from a module that gets unloaded and deleted. This function should only be - // called if GetSection() returns an empty shared pointer and you want to - // know if this address used to have a valid section. - //------------------------------------------------------------------ - bool SectionWasDeletedPrivate() const; }; //---------------------------------------------------------------------- Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py?rev=341849&r1=341848&r2=341849&view=diff ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py (original) +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py Mon Sep 10 11:19:01 2018 @@ -97,3 +97,40 @@ class AddressBreakpointTestCase(TestBase # The hit count for the breakpoint should now be 2. self.assertTrue(breakpoint.GetHitCount() == 2) + + + + def test_address_breakpoint_set_before_launch(self): + """Test that an address bp set before the process is launched works correctly.""" + self.build() + + exe = self.getBuildArtifact("a.out") + + # Create a target by the debugger. + target = self.dbg.CreateTarget(exe) + self.assertTrue(target, VALID_TARGET) + + # get the address of the symbol "main" + sc_list = target.FindSymbols("main", lldb.eSymbolTypeCode) + symbol = sc_list.GetContextAtIndex(0).GetSymbol() + address = symbol.GetStartAddress().GetFileAddress() + + # BreakpointCreateBySBAddress will resolve the address, causing this + # test to always pass, so use runCmd + self.runCmd("break set -a " + str(address)) + + # Disable ASLR. This will allow us to actually test (on platforms that support this flag) + # that the breakpoint was able to track the module. + + launch_info = lldb.SBLaunchInfo(None) + flags = launch_info.GetLaunchFlags() + flags &= ~lldb.eLaunchFlagDisableASLR + launch_info.SetLaunchFlags(flags) + + error = lldb.SBError() + + process = target.Launch(launch_info, error) + self.assertTrue(process, PROCESS_IS_VALID) + self.expect("process status", STOPPED_DUE_TO_BREAKPOINT, + substrs=["stop reason = breakpoint 1.1"]) + Modified: lldb/trunk/source/Breakpoint/Breakpoint.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Breakpoint/Breakpoint.cpp?rev=341849&r1=341848&r2=341849&view=diff ============================================================================== --- lldb/trunk/source/Breakpoint/Breakpoint.cpp (original) +++ lldb/trunk/source/Breakpoint/Breakpoint.cpp Mon Sep 10 11:19:01 2018 @@ -555,7 +555,7 @@ void Breakpoint::ModulesChanged(ModuleLi // address that we haven't resolved to a section yet. So we'll have to // look in all the new modules to resolve this location. Otherwise, if // it was set in this module, re-resolve it here. - if (section_sp && section_sp->GetModule() == module_sp) { + if (!section_sp || section_sp->GetModule() == module_sp) { if (!seen) seen = true; Modified: lldb/trunk/source/Core/Address.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Address.cpp?rev=341849&r1=341848&r2=341849&view=diff ============================================================================== --- lldb/trunk/source/Core/Address.cpp (original) +++ lldb/trunk/source/Core/Address.cpp Mon Sep 10 11:19:01 2018 @@ -281,7 +281,7 @@ addr_t Address::GetFileAddress() const { // We have a valid file range, so we can return the file based address by // adding the file base address to our offset return sect_file_addr + m_offset; - } else if (SectionWasDeletedPrivate()) { + } else if (SectionWasDeleted()) { // Used to have a valid section but it got deleted so the offset doesn't // mean anything without the section return LLDB_INVALID_ADDRESS; @@ -302,7 +302,7 @@ addr_t Address::GetLoadAddress(Target *t return sect_load_addr + m_offset; } } - } else if (SectionWasDeletedPrivate()) { + } else if (SectionWasDeleted()) { // Used to have a valid section but it got deleted so the offset doesn't // mean anything without the section return LLDB_INVALID_ADDRESS; @@ -761,12 +761,6 @@ bool Address::Dump(Stream *s, ExecutionC } bool Address::SectionWasDeleted() const { - if (GetSection()) - return false; - return SectionWasDeletedPrivate(); -} - -bool Address::SectionWasDeletedPrivate() const { lldb::SectionWP empty_section_wp; // If either call to "std::weak_ptr::owner_before(...) value returns true, _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits