Source code for libdebug.architectures.ptrace_hardware_breakpoint_manager

#
# This file is part of libdebug Python library (https://github.com/libdebug/libdebug).
# Copyright (c) 2023-2024 Roberto Alessandro Bertolini. All rights reserved.
# Licensed under the MIT license. See LICENSE file in the project root for details.
#

from __future__ import annotations

from abc import ABC, abstractmethod
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from collections.abc import Callable

    from libdebug.data.breakpoint import Breakpoint
    from libdebug.state.thread_context import ThreadContext


[docs] class PtraceHardwareBreakpointManager(ABC): """An architecture-independent interface for managing hardware breakpoints. Attributes: thread (ThreadContext): The target thread. peek_user (callable): A function that reads a number of bytes from the target thread registers. poke_user (callable): A function that writes a number of bytes to the target thread registers. breakpoint_count (int): The number of hardware breakpoints set. """ def __init__( self: PtraceHardwareBreakpointManager, thread: ThreadContext, peek_user: Callable[[int, int], int], poke_user: Callable[[int, int, int], None], ) -> None: """Initializes the hardware breakpoint manager.""" self.thread = thread self.peek_user = peek_user self.poke_user = poke_user self.breakpoint_count = 0
[docs] @abstractmethod def install_breakpoint(self: PtraceHardwareBreakpointManager, bp: Breakpoint) -> None: """Installs a hardware breakpoint at the provided location."""
[docs] @abstractmethod def remove_breakpoint(self: PtraceHardwareBreakpointManager, bp: Breakpoint) -> None: """Removes a hardware breakpoint at the provided location."""
[docs] @abstractmethod def available_breakpoints(self: PtraceHardwareBreakpointManager) -> int: """Returns the number of available hardware breakpoint registers."""
[docs] @abstractmethod def is_watchpoint_hit(self: PtraceHardwareBreakpointManager) -> Breakpoint | None: """Checks if a watchpoint has been hit. Returns: Breakpoint | None: The watchpoint that has been hit, or None if no watchpoint has been hit. """