summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibDebug/DebugSession.h
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Libraries/LibDebug/DebugSession.h')
-rw-r--r--Userland/Libraries/LibDebug/DebugSession.h49
1 files changed, 25 insertions, 24 deletions
diff --git a/Userland/Libraries/LibDebug/DebugSession.h b/Userland/Libraries/LibDebug/DebugSession.h
index 6b8d5850b5..7bdf673169 100644
--- a/Userland/Libraries/LibDebug/DebugSession.h
+++ b/Userland/Libraries/LibDebug/DebugSession.h
@@ -32,15 +32,15 @@ public:
virtual ~DebugSession() override;
// ^Debug::ProcessInspector
- virtual bool poke(void* address, FlatPtr data) override;
- virtual Optional<FlatPtr> peek(void* address) const override;
+ virtual bool poke(FlatPtr address, FlatPtr data) override;
+ virtual Optional<FlatPtr> peek(FlatPtr address) const override;
virtual PtraceRegisters get_registers() const override;
virtual void set_registers(PtraceRegisters const&) override;
virtual void for_each_loaded_library(Function<IterationDecision(LoadedLibrary const&)>) const override;
int pid() const { return m_debuggee_pid; }
- bool poke_debug(u32 register_index, FlatPtr data);
+ bool poke_debug(u32 register_index, FlatPtr data) const;
Optional<FlatPtr> peek_debug(u32 register_index) const;
enum class BreakPointState {
@@ -49,7 +49,7 @@ public:
};
struct BreakPoint {
- void* address { nullptr };
+ FlatPtr address { 0 };
FlatPtr original_first_word { 0 };
BreakPointState state { BreakPointState::Disabled };
};
@@ -70,22 +70,22 @@ public:
Optional<InsertBreakpointAtSourcePositionResult> insert_breakpoint(String const& filename, size_t line_number);
- bool insert_breakpoint(void* address);
- bool disable_breakpoint(void* address);
- bool enable_breakpoint(void* address);
- bool remove_breakpoint(void* address);
- bool breakpoint_exists(void* address) const;
+ bool insert_breakpoint(FlatPtr address);
+ bool disable_breakpoint(FlatPtr address);
+ bool enable_breakpoint(FlatPtr address);
+ bool remove_breakpoint(FlatPtr address);
+ bool breakpoint_exists(FlatPtr address) const;
struct WatchPoint {
- void* address { nullptr };
+ FlatPtr address { 0 };
u32 debug_register_index { 0 };
u32 ebp { 0 };
};
- bool insert_watchpoint(void* address, u32 ebp);
- bool remove_watchpoint(void* address);
- bool disable_watchpoint(void* address);
- bool watchpoint_exists(void* address) const;
+ bool insert_watchpoint(FlatPtr address, u32 ebp);
+ bool remove_watchpoint(FlatPtr address);
+ bool disable_watchpoint(FlatPtr address);
+ bool watchpoint_exists(FlatPtr address) const;
void dump_breakpoints()
{
@@ -104,7 +104,7 @@ public:
int continue_debuggee_and_wait(ContinueType type = ContinueType::FreeRun);
// Returns the new eip
- void* single_step();
+ FlatPtr single_step();
void detach();
@@ -141,8 +141,8 @@ private:
String m_source_root;
bool m_is_debuggee_dead { false };
- HashMap<void*, BreakPoint> m_breakpoints;
- HashMap<void*, WatchPoint> m_watchpoints;
+ HashMap<FlatPtr, BreakPoint> m_breakpoints;
+ HashMap<FlatPtr, WatchPoint> m_watchpoints;
// Maps from library name to LoadedLibrary object
HashMap<String, NonnullOwnPtr<LoadedLibrary>> m_loaded_libraries;
@@ -216,8 +216,8 @@ void DebugSession::run(DesiredInitialDebugeeState initial_debugee_state, Callbac
found_ebp = true;
break;
}
- auto return_address = peek(reinterpret_cast<u32*>(current_ebp + sizeof(FlatPtr)));
- auto next_ebp = peek(reinterpret_cast<u32*>(current_ebp));
+ auto return_address = peek(current_ebp + sizeof(FlatPtr));
+ auto next_ebp = peek(current_ebp);
VERIFY(return_address.has_value());
VERIFY(next_ebp.has_value());
current_instruction = return_address.value();
@@ -235,11 +235,11 @@ void DebugSession::run(DesiredInitialDebugeeState initial_debugee_state, Callbac
Optional<BreakPoint> current_breakpoint;
if (state == State::FreeRun || state == State::Syscall) {
- current_breakpoint = m_breakpoints.get((void*)((uintptr_t)current_instruction - 1));
+ current_breakpoint = m_breakpoints.get(current_instruction - 1);
if (current_breakpoint.has_value())
state = State::FreeRun;
} else {
- current_breakpoint = m_breakpoints.get((void*)current_instruction);
+ current_breakpoint = m_breakpoints.get(current_instruction);
}
if (current_breakpoint.has_value()) {
@@ -250,7 +250,7 @@ void DebugSession::run(DesiredInitialDebugeeState initial_debugee_state, Callbac
// because the cpu has just executed the INT3 we patched into the instruction.
// 2. We restore the original first byte of the instruction,
// because it was patched with INT3.
- auto breakpoint_addr = reinterpret_cast<uintptr_t>(current_breakpoint.value().address);
+ auto breakpoint_addr = bit_cast<FlatPtr>(current_breakpoint.value().address);
#if ARCH(I386)
regs.eip = breakpoint_addr;
#else
@@ -278,8 +278,9 @@ void DebugSession::run(DesiredInitialDebugeeState initial_debugee_state, Callbac
bool did_single_step = false;
+ auto current_breakpoint_address = bit_cast<FlatPtr>(current_breakpoint.value().address);
// Re-enable the breakpoint if it wasn't removed by the user
- if (current_breakpoint.has_value() && m_breakpoints.contains(current_breakpoint.value().address)) {
+ if (current_breakpoint.has_value() && m_breakpoints.contains(current_breakpoint_address)) {
// The current breakpoint was removed to make it transparent to the user.
// We now want to re-enable it - the code execution flow could hit it again.
// To re-enable the breakpoint, we first perform a single step and execute the
@@ -288,7 +289,7 @@ void DebugSession::run(DesiredInitialDebugeeState initial_debugee_state, Callbac
// If the user manually inserted a breakpoint at the current instruction,
// we need to disable that breakpoint because we want to singlestep over that
// instruction (we re-enable it again later anyways).
- if (m_breakpoints.contains(current_breakpoint.value().address) && m_breakpoints.get(current_breakpoint.value().address).value().state == BreakPointState::Enabled) {
+ if (m_breakpoints.contains(current_breakpoint_address) && m_breakpoints.get(current_breakpoint_address).value().state == BreakPointState::Enabled) {
disable_breakpoint(current_breakpoint.value().address);
}
auto stopped_address = single_step();