| # Copyright 2026 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. | |
| from typing import Any, ClassVar, Final, Literal | |
| from shared.protocol.base import BaseRequest | |
| COMMAND_NAME: Final = "watch" | |
| # zxdb does not support read-only watchpoints, so "read" is intentionally | |
| # excluded from the DAP `DataBreakpointAccessType` values. | |
| WatchAccessType = Literal["write", "readWrite"] | |
| class WatchRequest(BaseRequest[dict[str, Any]]): | |
| """Request to set or delete a data breakpoint (watchpoint) on a variable, | |
| expression, or memory address. | |
| `name` is the variable or expression to watch when setting a watchpoint, | |
| or the `data_id` of the watchpoint to remove when `delete=True`. Active | |
| watchpoints, including both their `data_id` and `expression`, are listed | |
| in `get-state`. | |
| When setting a watchpoint, `thread_id` and `access_type` are required | |
| (`frame_index` is optional, defaulting to 0) to identify the target process | |
| and stack frame for evaluation. If the thread is running, the daemon | |
| automatically pauses it first. | |
| To watch a memory address, pass a dereferenced pointer expression | |
| (e.g., `*(uint32_t*)0x1234`). | |
| To clear all active watchpoints, set `clear=True`. | |
| """ | |
| command: Literal["watch"] = COMMAND_NAME | |
| name: str = "" | |
| thread_id: int | None = None | |
| frame_index: int = 0 | |
| access_type: WatchAccessType | None = None | |
| condition: str | None = None | |
| hit_condition: str | None = None | |
| delete: bool = False | |
| clear: bool = False | |
| response_type: ClassVar[Any] = dict[str, Any] |