[Lldb-commits] [lldb] r341849 - Fix raw address breakpoints not resolving

Davide Italiano via lldb-commits lldb-commits at lists.llvm.org
Mon Sep 10 16:10:58 PDT 2018


Reverted on behalf of Ted in r341878.
On Mon, Sep 10, 2018 at 11:20 AM Ted Woodward via lldb-commits
<lldb-commits at lists.llvm.org> wrote:
>
> 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


More information about the lldb-commits mailing list