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

3 4
import "reflect"

D
Dan Mace 已提交
5 6 7 8
// DebuggerState represents the current context of the debugger.
type DebuggerState struct {
	// CurrentThread is the currently selected debugger thread.
	CurrentThread *Thread `json:"currentThread,omitempty"`
9 10
	// SelectedGoroutine is the currently selected goroutine
	SelectedGoroutine *Goroutine `json:"currentGoroutine,omitempty"`
11 12
	// List of all the process threads
	Threads []*Thread
D
Dan Mace 已提交
13
	// Exited indicates whether the debugged process has exited.
14 15
	Exited     bool `json:"exited"`
	ExitStatus int  `json:"exitStatus"`
A
aarzilli 已提交
16 17
	// Filled by RPCClient.Continue, indicates an error
	Err error `json:"-"`
D
Dan Mace 已提交
18 19
}

D
Derek Parker 已提交
20
// Breakpoint addresses a location at which process execution may be
D
Dan Mace 已提交
21
// suspended.
D
Derek Parker 已提交
22
type Breakpoint struct {
D
Dan Mace 已提交
23 24 25 26 27 28 29 30 31 32 33
	// ID is a unique identifier for the breakpoint.
	ID int `json:"id"`
	// 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 已提交
34 35 36 37 38 39 40 41

	// tracepoint flag
	Tracepoint bool `json:"continue"`
	// number of stack frames to retrieve
	Stacktrace int `json:"stacktrace"`
	// retrieve goroutine information
	Goroutine bool `json:"goroutine"`
	// variables to evaluate
D
Derek Parker 已提交
42
	Variables []string `json:"variables,omitempty"`
43 44 45 46
	// 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 已提交
47 48 49 50 51 52 53 54 55 56 57 58 59 60
}

// 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"`
61 62 63 64 65 66 67 68

	// 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
	BreakpointInfo *BreakpointInfo `json:"breakPointInfo,omitrempty"`
D
Dan Mace 已提交
69 70
}

A
aarzilli 已提交
71 72 73 74 75 76 77
type Location struct {
	PC       uint64    `json:"pc"`
	File     string    `json:"file"`
	Line     int       `json:"line"`
	Function *Function `json:"function,omitempty"`
}

78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
type Stackframe struct {
	Location
	Locals    []Variable
	Arguments []Variable
}

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 已提交
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
// Function represents thread-scoped function information.
type Function struct {
	// Name is the function name.
	Name   string `json:"name"`
	Value  uint64 `json:"value"`
	Type   byte   `json:"type"`
	GoType uint64 `json:"goType"`
	// Args are the function arguments in a thread context.
	Args []Variable `json:"args"`
	// Locals are the thread local variables.
	Locals []Variable `json:"locals"`
}

// Variable describes a variable.
type Variable struct {
113 114 115 116
	// Name of the variable or struct member
	Name string `json:"name"`
	// Address of the variable or struct member
	Addr uintptr `json:"addr"`
A
aarzilli 已提交
117 118
	// Only the address field is filled (result of evaluating expressions like &<expr>)
	OnlyAddr bool `json:"onlyAddr"`
119 120 121 122 123 124 125 126 127
	// Go type of the variable
	Type string `json:"type"`
	// Type of the variable after resolving any typedefs
	RealType string `json:"realType"`

	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 已提交
128
	Value string `json:"value"`
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143

	// 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
	// This field's length is capped at proc.maxArrayValues for slices and arrays and 2*proc.maxArrayValues for maps, in the circumnstances where the cap takes effect len(Children) != Len
	// 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 thier member fields returned)
	Children []Variable `json:"children"`

	// Unreadable addresses will have this field set
	Unreadable string `json:"unreadable"`
D
Dan Mace 已提交
144 145 146 147 148 149 150
}

// 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"`
151
	// Current location of the goroutine
152
	CurrentLoc Location `json:"currentLoc"`
153
	// Current location of the goroutine, excluding calls inside runtime
154
	UserCurrentLoc Location `json:"userCurrentLoc"`
155
	// Location of the go instruction that started this goroutine
156
	GoStatementLoc Location `json:"goStatementLoc"`
D
Dan Mace 已提交
157 158 159 160 161 162 163 164 165
}

// 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"`
166 167 168
	// GoroutineID is used to specify which thread to use with the SwitchGoroutine
	// command.
	GoroutineID int `json:"goroutineID,omitempty"`
D
Dan Mace 已提交
169 170
}

A
aarzilli 已提交
171 172
// Informations about the current breakpoint
type BreakpointInfo struct {
173 174 175 176
	Stacktrace []Stackframe `json:"stacktrace,omitempty"`
	Goroutine  *Goroutine   `json:"goroutine,omitempty"`
	Variables  []Variable   `json:"variables,omitempty"`
	Arguments  []Variable   `json:"arguments,omitempty"`
A
aarzilli 已提交
177 178
}

179 180 181 182 183
type EvalScope struct {
	GoroutineID int
	Frame       int
}

D
Dan Mace 已提交
184 185 186 187 188 189 190 191 192
const (
	// Continue resumes process execution.
	Continue = "continue"
	// Step continues for a single instruction, entering function calls.
	Step = "step"
	// Next continues to the next source line, not entering function calls.
	Next = "next"
	// SwitchThread switches the debugger's current thread context.
	SwitchThread = "switchThread"
193 194
	// SwitchGoroutine switches the debugger's current thread context to the thread running the specified goroutine
	SwitchGoroutine = "switchGoroutine"
D
Dan Mace 已提交
195 196 197
	// Halt suspends the process.
	Halt = "halt"
)