summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Core/Address.h19
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py37
-rw-r--r--lldb/source/Breakpoint/Breakpoint.cpp2
-rw-r--r--lldb/source/Core/Address.cpp10
4 files changed, 45 insertions, 23 deletions
diff --git a/lldb/include/lldb/Core/Address.h b/lldb/include/lldb/Core/Address.h
index 617aaefe91c..26924218172 100644
--- a/lldb/include/lldb/Core/Address.h
+++ b/lldb/include/lldb/Core/Address.h
@@ -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;
};
//----------------------------------------------------------------------
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py b/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py
index 46191d85296..5d778023748 100644
--- a/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py
@@ -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"])
+
diff --git a/lldb/source/Breakpoint/Breakpoint.cpp b/lldb/source/Breakpoint/Breakpoint.cpp
index 1dc029654bf..bdeda4f06f4 100644
--- a/lldb/source/Breakpoint/Breakpoint.cpp
+++ b/lldb/source/Breakpoint/Breakpoint.cpp
@@ -555,7 +555,7 @@ void Breakpoint::ModulesChanged(ModuleList &module_list, bool load,
// 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;
diff --git a/lldb/source/Core/Address.cpp b/lldb/source/Core/Address.cpp
index f183245f7d3..eb54278d665 100644
--- a/lldb/source/Core/Address.cpp
+++ b/lldb/source/Core/Address.cpp
@@ -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 *target) const {
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, ExecutionContextScope *exe_scope, DumpStyle style,
}
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,
OpenPOWER on IntegriCloud