[lldb-dev] PATCH for Review: Fix Rendezvous breakpoint to only be set once, resolve addr in BreakpointLocationList::FindByAddress
Greg Clayton
gclayton at apple.com
Mon Jul 15 16:15:46 PDT 2013
You might think about storing the breakpoint ID instead of a shared pointer to the breakpoint.
On Jul 15, 2013, at 3:24 PM, Michael Sartain <mikesart at gmail.com> wrote:
> This should fix the issue where multiple Rendezvous breakpoints could get set, get confused about the Rendezvous state, and then things head south.
>
> Also resolve the address in BreakpointLocationList FindByAddress (thanks Jim for that pointer).
>
> All the Linux tests run fine with this patch. Please let me know if it's ok to commit. Thanks.
> -Mike
>
> http://llvm-reviews.chandlerc.com/D1145
>
> Files:
> source/Breakpoint/BreakpointLocationList.cpp
> source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
> source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h
>
> Index: source/Breakpoint/BreakpointLocationList.cpp
> ===================================================================
> --- source/Breakpoint/BreakpointLocationList.cpp
> +++ source/Breakpoint/BreakpointLocationList.cpp
> @@ -14,7 +14,9 @@
> // Project includes
> #include "lldb/Breakpoint/BreakpointLocationList.h"
> #include "lldb/Breakpoint/BreakpointLocation.h"
> +#include "lldb/Breakpoint/Breakpoint.h"
> #include "lldb/Core/Section.h"
> +#include "lldb/Target/Target.h"
>
> using namespace lldb;
> using namespace lldb_private;
> @@ -114,7 +116,24 @@
> BreakpointLocationSP bp_loc_sp;
> if (!m_locations.empty())
> {
> - addr_map::const_iterator pos = m_address_to_location.find (addr);
> + Address so_addr;
> +
> + if (addr.IsSectionOffset())
> + {
> + so_addr = addr;
> + }
> + else
> + {
> + // Try and resolve as a load address if possible.
> + m_owner.GetTarget().GetSectionLoadList().ResolveLoadAddress (addr.GetOffset(), so_addr);
> + if (!so_addr.IsValid())
> + {
> + // The address didn't resolve, so just set to passed in addr.
> + so_addr = addr;
> + }
> + }
> +
> + addr_map::const_iterator pos = m_address_to_location.find (so_addr);
> if (pos != m_address_to_location.end())
> bp_loc_sp = pos->second;
> }
> Index: source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
> ===================================================================
> --- source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
> +++ source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
> @@ -263,13 +263,19 @@
> void
> DynamicLoaderPOSIXDYLD::SetRendezvousBreakpoint()
> {
> - Breakpoint *dyld_break;
> - addr_t break_addr;
> + addr_t break_addr = m_rendezvous.GetBreakAddress();
>
> - break_addr = m_rendezvous.GetBreakAddress();
> - dyld_break = m_process->GetTarget().CreateBreakpoint(break_addr, true).get();
> - dyld_break->SetCallback(RendezvousBreakpointHit, this, true);
> - dyld_break->SetBreakpointKind ("shared-library-event");
> + if (m_dyld_break_bp_sp)
> + {
> + // If we've already got a breakpoint, make sure it's pointing to the right address.
> + assert (m_dyld_break_bp_sp->FindLocationIDByAddress(break_addr) != LLDB_INVALID_BREAK_ID);
> + return;
> + }
> +
> + // Breakpoint *dyld_break;
> + m_dyld_break_bp_sp = m_process->GetTarget().CreateBreakpoint(break_addr, true);
> + m_dyld_break_bp_sp->SetCallback(RendezvousBreakpointHit, this, true);
> + m_dyld_break_bp_sp->SetBreakpointKind ("shared-library-event");
> }
>
> bool
> Index: source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h
> ===================================================================
> --- source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h
> +++ source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h
> @@ -92,6 +92,9 @@
> /// Auxiliary vector of the inferior process.
> std::unique_ptr<AuxVector> m_auxv;
>
> + /// Rendezvous breakpoint.
> + lldb::BreakpointSP m_dyld_break_bp_sp;
> +
> /// Enables a breakpoint on a function called by the runtime
> /// linker each time a module is loaded or unloaded.
> void
>
> <D1145.1.patch>_______________________________________________
> lldb-dev mailing list
> lldb-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
More information about the lldb-dev
mailing list