| """ |
| Test that writing memory does't affect hardware breakpoints. |
| """ |
| |
| |
| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| from functionalities.breakpoint.hardware_breakpoints.base import * |
| |
| |
| class WriteMemoryWithHWBreakpoint(HardwareBreakpointTestBase): |
| def does_not_support_hw_breakpoints(self): |
| return not super().supports_hw_breakpoints() |
| |
| @skipTestIfFn(does_not_support_hw_breakpoints) |
| def test_copy_memory_with_hw_break(self): |
| self.build() |
| exe = self.getBuildArtifact("a.out") |
| |
| # Create a target by the debugger. |
| target = self.dbg.CreateTarget(exe) |
| self.assertTrue(target, VALID_TARGET) |
| |
| # Run the program and stop at entry. |
| self.expect( |
| "process launch --stop-at-entry", patterns=["Process .* launched: .*a.out"] |
| ) |
| |
| process = target.GetProcess() |
| self.assertTrue(process, PROCESS_IS_VALID) |
| |
| # Set a hardware breakpoint. |
| bp_id = lldbutil.run_break_set_by_symbol( |
| self, "hw_break_function", extra_options="--hardware" |
| ) |
| |
| # Get breakpoint location from the breakpoint. |
| location = target.FindBreakpointByID(bp_id).GetLocationAtIndex(0) |
| self.assertTrue(location and location.IsResolved(), VALID_BREAKPOINT_LOCATION) |
| |
| # Check that writing overlapping memory doesn't crash. |
| address = location.GetLoadAddress() |
| data = str("\x01\x02\x03\x04") |
| error = lldb.SBError() |
| |
| result = process.WriteMemory(address, data, error) |
| self.assertTrue(error.Success() and result == len(bytes)) |