go-delve/delve · error

at least one of read and write must be set for watchpoint

Error message

at least one of read and write must be set for watchpoint

What it means

Error "at least one of read and write must be set for watchpoint" thrown in go-delve/delve.

Source

Thrown at pkg/proc/breakpoints.go:722

	fde, err := bi.frameEntries.FDEForPC(uprobePC)
	if err != nil {
		return 0, 0, fmt.Errorf("no FDE for uprobe PC %#x: %w", uprobePC, err)
	}
	framectx, err := fde.EstablishFrame(uprobePC)
	if err != nil {
		return 0, 0, fmt.Errorf("cannot establish frame at uprobe PC %#x: %w", uprobePC, err)
	}
	if framectx.CFA.Rule != frame.RuleCFA {
		return 0, 0, fmt.Errorf("unexpected CFA rule %d at uprobe PC %#x", framectx.CFA.Rule, uprobePC)
	}
	return uprobePC, framectx.CFA.Offset, nil
}

// SetWatchpoint sets a data breakpoint at addr and stores it in the
// process wide break point table.
func (t *Target) SetWatchpoint(logicalID int, scope *EvalScope, expr string, wtype WatchType, cond ast.Expr) (*Breakpoint, error) {
	if (wtype&WatchWrite == 0) && (wtype&WatchRead == 0) {
		return nil, errors.New("at least one of read and write must be set for watchpoint")
	}

	n, err := parser.ParseExpr(expr)
	if err != nil {
		return nil, err
	}
	xv, err := scope.evalAST(n)
	if err != nil {
		return nil, err
	}
	if xv.Addr == 0 || xv.Flags&VariableFakeAddress != 0 || xv.DwarfType == nil {
		return nil, fmt.Errorf("can not watch %q", expr)
	}
	if xv.Unreadable != nil {
		return nil, fmt.Errorf("expression %q is unreadable: %v", expr, xv.Unreadable)
	}
	if xv.Kind == reflect.UnsafePointer || xv.Kind == reflect.Invalid {
		return nil, fmt.Errorf("can not watch variable of type %s", xv.Kind.String())

View on GitHub (pinned to a23773e6c3)

When it happens

Trigger: Thrown at pkg/proc/breakpoints.go:722 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of go-delve/delve@a23773e6c3 (2026-08-31). Data as JSON: /api/errors/8043250aa23759ac. Report an issue: GitHub.