blob: 0bf69b022d6eb7680e9b56c784d3932f6de76d0d [file] [log] [blame]
// Copyright 2018 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_ZXDB_CLIENT_BREAKPOINT_SETTINGS_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_BREAKPOINT_SETTINGS_H_
#include <stdint.h>
#include <optional>
#include <string>
#include <string_view>
#include <vector>
#include "src/developer/debug/ipc/records.h"
#include "src/developer/debug/shared/arch.h"
#include "src/developer/debug/zxdb/client/execution_scope.h"
#include "src/developer/debug/zxdb/common/err.h"
#include "src/developer/debug/zxdb/symbols/input_location.h"
namespace zxdb {
class Target;
class Thread;
// The defaults for the settings should be chosen to be appropriate for new breakpoints if that
// setting is not specified.
struct BreakpointSettings {
// What to stop when this breakpoint is hit.
// TODO(dangyi): Merge this with debug_ipc::Stop.
enum class StopMode {
kNone, // Don't stop anything. Hit counts will still accumulate.
kThread, // Stop only the thread that hit the breakpoint.
kProcess, // Stop all threads of the process that hit the breakpoint.
kAll // Stop all debugged processes.
};
using Type = debug_ipc::BreakpointType;
// Converts between the StopMode/Type enums and string values. These strings are the same ones
// used in the settings system. On failure, *ToString returns "<invalid>" on failure (never
// null), and StringTo*() returns nullopt.
static const char* StopModeToString(StopMode);
static std::optional<StopMode> StringToStopMode(std::string_view);
static const char* TypeToString(Type);
static std::optional<Type> StringToType(std::string_view);
// Returns whether the given breakpoint type supports a byte_size.
static bool TypeHasSize(Type);
// This function will validate the size and return a error if it's invalid.
static Err ValidateSize(debug::Arch arch, Type type, uint32_t byte_size);
// What kind of breakpoint implementation to use.
Type type = Type::kSoftware;
// Size in bytes for hardware breakpoints. Used only for read and read-write breakpoints. See
// TypeHasSize() above.
uint32_t byte_size = 0;
// Name that the creator of the breakpoint can set for easier debugging. Optional.
std::string name;
// Enables (true) or disables (false) this breakpoint.
bool enabled = true;
// Which processes or threads this breakpoint applies to.
//
// One normally shouldn't make an address breakpoint with "session" scope since since addresses
// won't match between processes.
ExecutionScope scope;
// Where the breakpoint is set. This supports more than one location because a user input might
// expand to multiple symbols depending on the context. In many cases there will only be one.
std::vector<InputLocation> locations;
StopMode stop_mode = StopMode::kAll;
// When set, this breakpoint will be automatically deleted when it's hit.
bool one_shot = false;
// Break every hit_mult times the breakpoint gets hit. Must be positive.
// The breakpoint will become conditional if hit_mult is greater than 1.
int hit_mult = 1;
// Handles the automatic collection of memory if it's requested.
bool has_automation = false;
std::vector<debug_ipc::AutomationInstruction> instructions;
};
} // namespace zxdb
#endif // SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_BREAKPOINT_SETTINGS_H_