types.go 12.8 KB
Newer Older
D
Dan Mace 已提交
1 2
package api

A
aarzilli 已提交
3
import (
A
aarzilli 已提交
4
	"bytes"
5 6
	"errors"
	"fmt"
A
aarzilli 已提交
7
	"reflect"
8 9
	"strconv"
	"unicode"
H
Hubert Krauze 已提交
10

D
Derek Parker 已提交
11
	"github.com/derekparker/delve/pkg/proc"
A
aarzilli 已提交
12
)
13

14 15
var NotExecutableErr = proc.NotExecutableErr

D
Dan Mace 已提交
16 17
// DebuggerState represents the current context of the debugger.
type DebuggerState struct {
18 19
	// Running is true if the process is running and no other information can be collected.
	Running bool
D
Dan Mace 已提交
20 21
	// CurrentThread is the currently selected debugger thread.
	CurrentThread *Thread `json:"currentThread,omitempty"`
22 23
	// SelectedGoroutine is the currently selected goroutine
	SelectedGoroutine *Goroutine `json:"currentGoroutine,omitempty"`
24 25
	// List of all the process threads
	Threads []*Thread
26 27 28 29 30
	// NextInProgress indicates that a next or step operation was interrupted by another breakpoint
	// or a manual stop and is waiting to complete.
	// While NextInProgress is set further requests for next or step may be rejected.
	// Either execute continue until NextInProgress is false or call CancelNext
	NextInProgress bool
D
Dan Mace 已提交
31
	// Exited indicates whether the debugged process has exited.
32 33
	Exited     bool `json:"exited"`
	ExitStatus int  `json:"exitStatus"`
34 35
	// When contains a description of the current position in a recording
	When string
A
aarzilli 已提交
36 37
	// Filled by RPCClient.Continue, indicates an error
	Err error `json:"-"`
D
Dan Mace 已提交
38 39
}

D
Derek Parker 已提交
40
// Breakpoint addresses a location at which process execution may be
D
Dan Mace 已提交
41
// suspended.
D
Derek Parker 已提交
42
type Breakpoint struct {
D
Dan Mace 已提交
43 44
	// ID is a unique identifier for the breakpoint.
	ID int `json:"id"`
45 46
	// User defined name of the breakpoint
	Name string `json:"name"`
D
Dan Mace 已提交
47 48 49 50 51 52 53 54 55
	// Addr is the address of the breakpoint.
	Addr uint64 `json:"addr"`
	// File is the source file for the breakpoint.
	File string `json:"file"`
	// Line is a line in File for the breakpoint.
	Line int `json:"line"`
	// FunctionName is the name of the function at the current breakpoint, and
	// may not always be available.
	FunctionName string `json:"functionName,omitempty"`
A
aarzilli 已提交
56

57 58 59
	// Breakpoint condition
	Cond string

A
aarzilli 已提交
60 61 62 63
	// tracepoint flag
	Tracepoint bool `json:"continue"`
	// retrieve goroutine information
	Goroutine bool `json:"goroutine"`
H
Hubert Krauze 已提交
64 65
	// number of stack frames to retrieve
	Stacktrace int `json:"stacktrace"`
66
	// expressions to evaluate
D
Derek Parker 已提交
67
	Variables []string `json:"variables,omitempty"`
68 69 70 71
	// LoadArgs requests loading function arguments when the breakpoint is hit
	LoadArgs *LoadConfig
	// LoadLocals requests loading function locals when the breakpoint is hit
	LoadLocals *LoadConfig
72 73 74 75
	// number of times a breakpoint has been reached in a certain goroutine
	HitCount map[string]uint64 `json:"hitCount"`
	// number of times a breakpoint has been reached
	TotalHitCount uint64 `json:"totalHitCount"`
D
Dan Mace 已提交
76 77
}

78 79 80 81 82 83 84 85 86 87 88 89 90 91
func ValidBreakpointName(name string) error {
	if _, err := strconv.Atoi(name); err == nil {
		return errors.New("breakpoint name can not be a number")
	}

	for _, ch := range name {
		if !(unicode.IsLetter(ch) || unicode.IsDigit(ch)) {
			return fmt.Errorf("invalid character in breakpoint name '%c'", ch)
		}
	}

	return nil
}

D
Dan Mace 已提交
92 93 94 95 96 97 98 99 100 101 102 103
// Thread is a thread within the debugged process.
type Thread struct {
	// ID is a unique identifier for the thread.
	ID int `json:"id"`
	// PC is the current program counter for the thread.
	PC uint64 `json:"pc"`
	// File is the file for the program counter.
	File string `json:"file"`
	// Line is the line number for the program counter.
	Line int `json:"line"`
	// Function is function information at the program counter. May be nil.
	Function *Function `json:"function,omitempty"`
104 105 106 107 108 109 110

	// ID of the goroutine running on this thread
	GoroutineID int `json:"goroutineID"`

	// Breakpoint this thread is stopped at
	Breakpoint *Breakpoint `json:"breakPoint,omitempty"`
	// Informations requested by the current breakpoint
J
Josh Soref 已提交
111
	BreakpointInfo *BreakpointInfo `json:"breakPointInfo,omitempty"`
112 113 114

	// ReturnValues contains the return values of the function we just stepped out of
	ReturnValues []Variable
D
Dan Mace 已提交
115 116
}

A
aarzilli 已提交
117 118 119 120 121 122 123
type Location struct {
	PC       uint64    `json:"pc"`
	File     string    `json:"file"`
	Line     int       `json:"line"`
	Function *Function `json:"function,omitempty"`
}

124 125
type Stackframe struct {
	Location
126 127 128 129 130 131
	Locals    []Variable
	Arguments []Variable

	FrameOffset        int64
	FramePointerOffset int64

132 133
	Defers []Defer

134
	Err string
135 136
}

137 138 139 140 141 142 143
type Defer struct {
	DeferredLoc Location // deferred function
	DeferLoc    Location // location of the defer statement
	SP          uint64   // value of SP when the function was deferred
	Unreadable  string
}

144 145 146 147 148 149 150 151 152 153 154 155 156 157
func (frame *Stackframe) Var(name string) *Variable {
	for i := range frame.Locals {
		if frame.Locals[i].Name == name {
			return &frame.Locals[i]
		}
	}
	for i := range frame.Arguments {
		if frame.Arguments[i].Name == name {
			return &frame.Arguments[i]
		}
	}
	return nil
}

D
Dan Mace 已提交
158 159 160
// Function represents thread-scoped function information.
type Function struct {
	// Name is the function name.
161
	Name_  string `json:"name"`
D
Dan Mace 已提交
162 163 164
	Value  uint64 `json:"value"`
	Type   byte   `json:"type"`
	GoType uint64 `json:"goType"`
165 166
	// Optimized is true if the function was optimized
	Optimized bool `json:"optimized"`
D
Dan Mace 已提交
167 168
}

169 170 171 172 173 174 175
func (fn *Function) Name() string {
	if fn == nil {
		return "???"
	}
	return fn.Name_
}

A
aarzilli 已提交
176
// VariableFlags is the type of the Flags field of Variable.
177 178 179
type VariableFlags uint16

const (
A
aarzilli 已提交
180
	// VariableEscaped is set for local variables that escaped to the heap
181 182 183 184 185
	//
	// The compiler performs escape analysis on local variables, the variables
	// that may outlive the stack frame are allocated on the heap instead and
	// only the address is recorded on the stack. These variables will be
	// marked with this flag.
186
	VariableEscaped = VariableFlags(proc.VariableEscaped)
A
aarzilli 已提交
187 188 189 190

	// VariableShadowed is set for local variables that are shadowed by a
	// variable with the same name in another scope
	VariableShadowed = VariableFlags(proc.VariableShadowed)
191 192 193

	// VariableConstant means this variable is a constant value
	VariableConstant
194 195 196 197 198 199

	// VariableArgument means this variable is a function argument
	VariableArgument

	// VariableReturnArgument means this variable is a function return value
	VariableReturnArgument
200 201
)

D
Dan Mace 已提交
202 203
// Variable describes a variable.
type Variable struct {
204 205 206 207
	// Name of the variable or struct member
	Name string `json:"name"`
	// Address of the variable or struct member
	Addr uintptr `json:"addr"`
A
aarzilli 已提交
208 209
	// Only the address field is filled (result of evaluating expressions like &<expr>)
	OnlyAddr bool `json:"onlyAddr"`
210 211 212 213 214
	// Go type of the variable
	Type string `json:"type"`
	// Type of the variable after resolving any typedefs
	RealType string `json:"realType"`

215 216
	Flags VariableFlags `json:"flags"`

217 218 219 220
	Kind reflect.Kind `json:"kind"`

	//Strings have their length capped at proc.maxArrayValues, use Len for the real length of a string
	//Function variables will store the name of the function in this field
D
Dan Mace 已提交
221
	Value string `json:"value"`
222 223 224 225 226 227 228 229 230

	// Number of elements in an array or a slice, number of keys for a map, number of struct members for a struct, length of strings
	Len int64 `json:"len"`
	// Cap value for slices
	Cap int64 `json:"cap"`

	// Array and slice elements, member fields of structs, key/value pairs of maps, value of complex numbers
	// The Name field in this slice will always be the empty string except for structs (when it will be the field name) and for complex numbers (when it will be "real" and "imaginary")
	// For maps each map entry will have to items in this slice, even numbered items will represent map keys and odd numbered items will represent their values
J
Josh Soref 已提交
231
	// This field's length is capped at proc.maxArrayValues for slices and arrays and 2*proc.maxArrayValues for maps, in the circumstances where the cap takes effect len(Children) != Len
D
Derek Parker 已提交
232
	// The other length cap applied to this field is related to maximum recursion depth, when the maximum recursion depth is reached this field is left empty, contrary to the previous one this cap also applies to structs (otherwise structs will always have all their member fields returned)
233 234
	Children []Variable `json:"children"`

235 236 237 238 239 240
	// Base address of arrays, Base address of the backing array for slices (0 for nil slices)
	// Base address of the backing byte array for strings
	// address of the struct backing chan and map variables
	// address of the function entry point for function variables (0 for nil function pointers)
	Base uintptr `json:"base"`

241 242
	// Unreadable addresses will have this field set
	Unreadable string `json:"unreadable"`
243 244 245

	// LocationExpr describes the location expression of this variable's address
	LocationExpr string
246 247
	// DeclLine is the line number of this variable's declaration
	DeclLine int64
D
Dan Mace 已提交
248 249
}

250 251 252 253 254 255 256 257 258 259 260 261 262 263
// LoadConfig describes how to load values from target's memory
type LoadConfig struct {
	// FollowPointers requests pointers to be automatically dereferenced.
	FollowPointers bool
	// MaxVariableRecurse is how far to recurse when evaluating nested types.
	MaxVariableRecurse int
	// MaxStringLen is the maximum number of bytes read from a string
	MaxStringLen int
	// MaxArrayValues is the maximum number of elements read from an array, a slice or a map.
	MaxArrayValues int
	// MaxStructFields is the maximum number of fields read from a struct, -1 will read all fields.
	MaxStructFields int
}

D
Dan Mace 已提交
264 265 266 267 268
// Goroutine represents the information relevant to Delve from the runtime's
// internal G structure.
type Goroutine struct {
	// ID is a unique identifier for the goroutine.
	ID int `json:"id"`
269
	// Current location of the goroutine
270
	CurrentLoc Location `json:"currentLoc"`
271
	// Current location of the goroutine, excluding calls inside runtime
272
	UserCurrentLoc Location `json:"userCurrentLoc"`
273
	// Location of the go instruction that started this goroutine
274
	GoStatementLoc Location `json:"goStatementLoc"`
275 276
	// Location of the starting function
	StartLoc Location `json:"startLoc"`
277 278
	// ID of the associated thread for running goroutines
	ThreadID int `json:"threadID"`
D
Dan Mace 已提交
279 280 281 282 283 284 285 286 287
}

// DebuggerCommand is a command which changes the debugger's execution state.
type DebuggerCommand struct {
	// Name is the command to run.
	Name string `json:"name"`
	// ThreadID is used to specify which thread to use with the SwitchThread
	// command.
	ThreadID int `json:"threadID,omitempty"`
288 289 290
	// GoroutineID is used to specify which thread to use with the SwitchGoroutine
	// command.
	GoroutineID int `json:"goroutineID,omitempty"`
291 292 293
	// When ReturnInfoLoadConfig is not nil it will be used to load the value
	// of any return variables.
	ReturnInfoLoadConfig *LoadConfig
294 295
	// Expr is the expression argument for a Call command
	Expr string `json:"expr,omitempty"`
D
Dan Mace 已提交
296 297
}

A
aarzilli 已提交
298 299
// Informations about the current breakpoint
type BreakpointInfo struct {
300 301 302 303
	Stacktrace []Stackframe `json:"stacktrace,omitempty"`
	Goroutine  *Goroutine   `json:"goroutine,omitempty"`
	Variables  []Variable   `json:"variables,omitempty"`
	Arguments  []Variable   `json:"arguments,omitempty"`
304
	Locals     []Variable   `json:"locals,omitempty"`
A
aarzilli 已提交
305 306
}

307 308 309 310 311
type EvalScope struct {
	GoroutineID int
	Frame       int
}

D
Dan Mace 已提交
312 313 314
const (
	// Continue resumes process execution.
	Continue = "continue"
315 316
	// Rewind resumes process execution backwards (target must be a recording).
	Rewind = "rewind"
317
	// Step continues to next source line, entering function calls.
D
Dan Mace 已提交
318
	Step = "step"
A
aarzilli 已提交
319 320
	// StepOut continues to the return address of the current function
	StepOut = "stepOut"
321 322
	// SingleStep continues for exactly 1 cpu instruction.
	StepInstruction = "stepInstruction"
D
Dan Mace 已提交
323 324 325 326
	// Next continues to the next source line, not entering function calls.
	Next = "next"
	// SwitchThread switches the debugger's current thread context.
	SwitchThread = "switchThread"
327 328
	// SwitchGoroutine switches the debugger's current thread context to the thread running the specified goroutine
	SwitchGoroutine = "switchGoroutine"
D
Dan Mace 已提交
329 330
	// Halt suspends the process.
	Halt = "halt"
331 332
	// Call resumes process execution injecting a function call.
	Call = "call"
D
Dan Mace 已提交
333
)
A
aarzilli 已提交
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358

type AssemblyFlavour int

const (
	GNUFlavour   = AssemblyFlavour(proc.GNUFlavour)
	IntelFlavour = AssemblyFlavour(proc.IntelFlavour)
)

// AsmInstruction represents one assembly instruction at some address
type AsmInstruction struct {
	// Loc is the location of this instruction
	Loc Location
	// Destination of CALL instructions
	DestLoc *Location
	// Text is the formatted representation of the instruction
	Text string
	// Bytes is the instruction as read from memory
	Bytes []byte
	// If Breakpoint is true a breakpoint is set at this instruction
	Breakpoint bool
	// In AtPC is true this is the instruction the current thread is stopped at
	AtPC bool
}

type AsmInstructions []AsmInstruction
A
aarzilli 已提交
359 360 361 362 363 364 365 366 367 368 369 370 371 372 373

type GetVersionIn struct {
}

type GetVersionOut struct {
	DelveVersion string
	APIVersion   int
}

type SetAPIVersionIn struct {
	APIVersion int
}

type SetAPIVersionOut struct {
}
A
aarzilli 已提交
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395

type Register struct {
	Name  string
	Value string
}

type Registers []Register

func (regs Registers) String() string {
	maxlen := 0
	for _, reg := range regs {
		if n := len(reg.Name); n > maxlen {
			maxlen = n
		}
	}

	var buf bytes.Buffer
	for _, reg := range regs {
		fmt.Fprintf(&buf, "%*s = %s\n", maxlen, reg.Name, reg.Value)
	}
	return buf.String()
}
396 397 398

type DiscardedBreakpoint struct {
	Breakpoint *Breakpoint
399
	Reason     string
400
}
401 402 403 404 405 406

type Checkpoint struct {
	ID    int
	When  string
	Where string
}