blob: 3ca7ae8d989add3d802caf5dd60d1859b5221f8b [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DEVELOPER_DEBUG_DEBUG_AGENT_WATCHPOINT_H_
#define SRC_DEVELOPER_DEBUG_DEBUG_AGENT_WATCHPOINT_H_
#include <stdint.h>
#include <zircon/types.h>
#include <set>
#include "src/developer/debug/debug_agent/arch.h"
#include "src/developer/debug/debug_agent/process_breakpoint.h"
#include "src/developer/debug/debug_agent/watchpoint_info.h"
namespace debug_agent {
class Watchpoint : public ProcessBreakpoint {
public:
// |type| must be kRead, kReadWrite or kWrite.
explicit Watchpoint(debug_ipc::BreakpointType type, Breakpoint* breakpoint,
DebuggedProcess* process, const debug_ipc::AddressRange& range);
~Watchpoint();
debug_ipc::BreakpointType Type() const override { return type_; }
bool Installed(zx_koid_t thread_koid) const override;
bool MatchesException(zx_koid_t thread_koid, uint64_t watchpoint_address, int slot);
zx_status_t Update() override;
// Public ProcessBreakpoint overrides. See ProcessBreakpoint for more details.
void EndStepOver(DebuggedThread* thread) override;
void ExecuteStepOver(DebuggedThread* thread) override;
void StepOverCleanup(DebuggedThread* thread) override {}
// Getters.
const std::map<zx_koid_t, WatchpointInfo>& installed_threads() const {
return installed_threads_;
}
const debug_ipc::AddressRange& range() const { return range_; }
private:
bool Install(DebuggedThread* thread);
zx_status_t Uninstall(DebuggedThread* thread) override;
zx_status_t Uninstall() override;
debug_ipc::BreakpointType type_ = debug_ipc::BreakpointType::kLast;
debug_ipc::AddressRange range_;
std::map<zx_koid_t, WatchpointInfo> installed_threads_;
std::set<zx_koid_t> current_stepping_over_threads_;
};
} // namespace debug_agent
#endif // SRC_DEVELOPER_DEBUG_DEBUG_AGENT_WATCHPOINT_H_