go-delve/delve · error

argument of dlv_command is not a string

Error message

argument of dlv_command is not a string

What it means

The dlv_command Starlark builtin executes a Delve CLI command. It requires every argument to be a starlark.String; if any positional argument is another Starlark type (int, list, None, etc.) it returns this error rather than coercing, so command text is always built from real strings.

Source

Thrown at pkg/terminal/starbind/starlark.go:93

	// Make the "time" module available to Starlark scripts.
	starlark.Universe["time"] = startime.Module

	var doc map[string]string
	env.env, doc = env.starlarkPredeclare()

	builtindoc := func(name, args, descr string) {
		doc[name] = name + args + "\n\n" + name + " " + descr
	}

	env.env[dlvCommandBuiltinName] = starlark.NewBuiltin(dlvCommandBuiltinName, func(thread *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
		if err := isCancelled(thread); err != nil {
			return starlark.None, err
		}
		argstrs := make([]string, len(args))
		for i := range args {
			a, ok := args[i].(starlark.String)
			if !ok {
				return nil, errors.New("argument of dlv_command is not a string")
			}
			argstrs[i] = string(a)
		}
		err := env.ctx.CallCommand(strings.Join(argstrs, " "))
		if err != nil && strings.Contains(err.Error(), " has exited with status ") {
			return env.interfaceToStarlarkValue(err), nil
		}
		return starlark.None, decorateError(thread, err)
	})
	builtindoc(dlvCommandBuiltinName, "(Command)", "interrupts, continues and steps through the program.")

	env.env[readFileBuiltinName] = starlark.NewBuiltin(readFileBuiltinName, func(thread *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
		if len(args) != 1 {
			return nil, decorateError(thread, errors.New("wrong number of arguments"))
		}
		path, ok := args[0].(starlark.String)
		if !ok {
			return nil, decorateError(thread, errors.New("argument of read_file was not a string"))

View on GitHub (pinned to a23773e6c3)

Solutions

  1. Convert arguments with str() before calling: `dlv_command("break main.go:" + str(line))`.
  2. Pass a single pre-joined string: `dlv_command(" ".join(args))` after mapping every element to str.
  3. Inspect argument types in the script (type(x) == "string") before invoking dlv_command.

Example fix

// before
line = 42
dlv_command("break main.go:", line)  # error
// after
line = 42
dlv_command("break main.go:" + str(line))
Defensive patterns

Strategy: type-guard

Validate before calling

def is_string(v):
    return type(v) == "string"

Type guard

def is_string(v):
    return type(v) == "string"

Try / catch

try:
    dlv_command(arg)
except Exception as e:
    if "not a string" in str(e):
        dlv_command(str(arg))
    else:
        raise

Prevention

When it happens

Trigger: Calling `dlv_command(123)`, `dlv_command(["break", "main.go:1"])`, or passing a non-string variable produced by a script (e.g. an int line number) directly to dlv_command.

Common situations: Scripts assembling commands with numeric line numbers or values returned from other dlv builtins; forgetting str() conversion; passing a list expecting the builtin to splat it.

Related errors


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