1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 08:08:12 +00:00

LibDebug: Add remove_breakpoint

Also, change the interface of all breakpoint management functions to
only take the address of the breakpoint as an argument.
This commit is contained in:
Itamar 2020-04-24 23:38:00 +03:00 committed by Andreas Kling
parent e00b85b8c0
commit 009b4ea3f4
4 changed files with 59 additions and 18 deletions

View file

@ -133,40 +133,58 @@ bool DebugSession::insert_breakpoint(void* address)
if (!original_bytes.has_value())
return false;
ASSERT((original_bytes.value() & 0xff) != BREAKPOINT_INSTRUCTION);
BreakPoint breakpoint { address, original_bytes.value(), BreakPointState::Disabled };
m_breakpoints.set(address, breakpoint);
enable_breakpoint(breakpoint);
enable_breakpoint(breakpoint.address);
return true;
}
bool DebugSession::disable_breakpoint(const BreakPoint& breakpoint)
bool DebugSession::disable_breakpoint(void* address)
{
ASSERT(m_breakpoints.contains(breakpoint.address));
if (!poke(reinterpret_cast<u32*>(reinterpret_cast<char*>(breakpoint.address)), breakpoint.original_first_word))
auto breakpoint = m_breakpoints.get(address);
ASSERT(breakpoint.has_value());
if (!poke(reinterpret_cast<u32*>(reinterpret_cast<char*>(breakpoint.value().address)), breakpoint.value().original_first_word))
return false;
auto bp = m_breakpoints.get(breakpoint.address).value();
auto bp = m_breakpoints.get(breakpoint.value().address).value();
bp.state = BreakPointState::Disabled;
m_breakpoints.set(bp.address, bp);
return true;
}
bool DebugSession::enable_breakpoint(const BreakPoint& breakpoint)
bool DebugSession::enable_breakpoint(void* address)
{
ASSERT(m_breakpoints.contains(breakpoint.address));
auto breakpoint = m_breakpoints.get(address);
ASSERT(breakpoint.has_value());
if (!poke(reinterpret_cast<u32*>(breakpoint.address), (breakpoint.original_first_word & ~(uint32_t)0xff) | BREAKPOINT_INSTRUCTION))
if (!poke(reinterpret_cast<u32*>(breakpoint.value().address), (breakpoint.value().original_first_word & ~(uint32_t)0xff) | BREAKPOINT_INSTRUCTION))
return false;
auto bp = m_breakpoints.get(breakpoint.address).value();
auto bp = m_breakpoints.get(breakpoint.value().address).value();
bp.state = BreakPointState::Enabled;
m_breakpoints.set(bp.address, bp);
return true;
}
bool DebugSession::remove_breakpoint(void* address)
{
if (!disable_breakpoint(address))
return false;
m_breakpoints.remove(address);
return true;
}
bool DebugSession::breakpoint_exists(void* address) const
{
return m_breakpoints.contains(address);
}
PtraceRegisters DebugSession::get_registers() const
{
PtraceRegisters regs;