package service import ( "time" "github.com/go-delve/delve/service/api" ) // Client represents a debugger service client. All client methods are // synchronous. type Client interface { // ProcessPid returns the pid of the process we are debugging. ProcessPid() int // BuildID returns the BuildID of the process' executable we are debugging. BuildID() string // LastModified returns the time that the process' executable was modified. LastModified() time.Time // Detach detaches the debugger, optionally killing the process. Detach(killProcess bool) error // Restart restarts program. Set true if you want to rebuild the process we are debugging. Restart(rebuild bool) ([]api.DiscardedBreakpoint, error) // RestartFrom restarts program from the specified position. RestartFrom(rerecord bool, pos string, resetArgs bool, newArgs []string, newRedirects [3]string, rebuild bool) ([]api.DiscardedBreakpoint, error) // GetState returns the current debugger state. GetState() (*api.DebuggerState, error) // GetStateNonBlocking returns the current debugger state, returning immediately if the target is already running. GetStateNonBlocking() (*api.DebuggerState, error) // Continue resumes process execution. Continue() <-chan *api.DebuggerState // Rewind resumes process execution backwards. Rewind() <-chan *api.DebuggerState // DirectionCongruentContinue resumes process execution, if a reverse next, step or stepout operation is in progress it will resume execution backward. DirectionCongruentContinue() <-chan *api.DebuggerState // Next continues to the next source line, not entering function calls. Next() (*api.DebuggerState, error) // ReverseNext continues backward to the previous line of source code, not entering function calls. ReverseNext() (*api.DebuggerState, error) // Step continues to the next source line, entering function calls. Step() (*api.DebuggerState, error) // ReverseStep continues backward to the previous line of source code, entering function calls. ReverseStep() (*api.DebuggerState, error) // StepOut continues to the return address of the current function. StepOut() (*api.DebuggerState, error) // ReverseStepOut continues backward to the caller of the current function. ReverseStepOut() (*api.DebuggerState, error) // Call resumes process execution while making a function call. Call(goroutineID int64, expr string, unsafe bool) (*api.DebuggerState, error) // StepInstruction will step a single cpu instruction. StepInstruction(skipCalls bool) (*api.DebuggerState, error) // ReverseStepInstruction will reverse step a single cpu instruction. ReverseStepInstruction(skipCalls bool) (*api.DebuggerState, error) // SwitchThread switches the current thread context. SwitchThread(threadID int) (*api.DebuggerState, error) // SwitchGoroutine switches the current goroutine (and the current thread as well) SwitchGoroutine(goroutineID int64) (*api.DebuggerState, error) // Halt suspends the process. Halt() (*api.DebuggerState, error) // GetBreakpoint gets a breakpoint by ID. GetBreakpoint(id int) (*api.Breakpoint, error) // GetBreakpointByName gets a breakpoint by name. GetBreakpointByName(name string) (*api.Breakpoint, error) // CreateBreakpoint creates a new breakpoint. CreateBreakpoint(*api.Breakpoint) (*api.Breakpoint, error) // CreateBreakpointWithExpr creates a new breakpoint and sets an expression to restore it after it is disabled. CreateBreakpointWithExpr(*api.Breakpoint, string, [][2]string, bool) (*api.Breakpoint, error) // CreateWatchpoint creates a new watchpoint. CreateWatchpoint(api.EvalScope, string, api.WatchType) (*api.Breakpoint, error) // ListBreakpoints gets all breakpoints. ListBreakpoints(bool) ([]*api.Breakpoint, error) // ClearBreakpoint deletes a breakpoint by ID. ClearBreakpoint(id int) (*api.Breakpoint, error) // ClearBreakpointByName deletes a breakpoint by name ClearBreakpointByName(name string) (*api.Breakpoint, error) // ToggleBreakpoint toggles on or off a breakpoint by ID. ToggleBreakpoint(id int) (*api.Breakpoint, error) // ToggleBreakpointByName toggles on or off a breakpoint by name. ToggleBreakpointByName(name string) (*api.Breakpoint, error) // AmendBreakpoint allows user to update an existing breakpoint for example to change the information // retrieved when the breakpoint is hit or to change, add or remove the break condition AmendBreakpoint(*api.Breakpoint) error // CancelNext cancels a Next or Step call that was interrupted by a manual stop or by another breakpoint CancelNext() error // ListThreads lists all threads. ListThreads() ([]*api.Thread, error) // GetThread gets a thread by its ID. GetThread(id int) (*api.Thread, error) // ListPackageVariables lists all package variables in the context of the current thread. ListPackageVariables(filter string, cfg api.LoadConfig) ([]api.Variable, error) // EvalVariable returns a variable in the context of the current thread. EvalVariable(scope api.EvalScope, symbol string, cfg api.LoadConfig) (*api.Variable, error) // SetVariable sets the value of a variable SetVariable(scope api.EvalScope, symbol, value string) error // ListSources lists all source files in the process matching filter. ListSources(filter string) ([]string, error) // ListFunctions lists all functions in the process matching filter. ListFunctions(filter string, tracefollow int) ([]string, error) // ListTypes lists all types in the process matching filter. ListTypes(filter string) ([]string, error) // ListPackagesBuildInfo lists all packages in the process matching filter. ListPackagesBuildInfo(filter string, includeFiles bool) ([]api.PackageBuildInfo, error) // ListLocalVariables lists all local variables in scope. ListLocalVariables(scope api.EvalScope, cfg api.LoadConfig) ([]api.Variable, error) // ListFunctionArgs lists all arguments to the current function. ListFunctionArgs(scope api.EvalScope, cfg api.LoadConfig) ([]api.Variable, error) // ListThreadRegisters lists registers and their values, for the given thread. ListThreadRegisters(threadID int, includeFp bool) (api.Registers, error) // ListScopeRegisters lists registers and their values, for the given scope. ListScopeRegisters(scope api.EvalScope, includeFp bool) (api.Registers, error) // ListGoroutines lists all goroutines. ListGoroutines(start, count int) ([]*api.Goroutine, int, error) // ListGoroutinesWithFilter lists goroutines matching the filters ListGoroutinesWithFilter(start, count int, filters []api.ListGoroutinesFilter, group *api.GoroutineGroupingOptions, scope *api.EvalScope) ([]*api.Goroutine, []api.GoroutineGroup, int, bool, error) // Stacktrace returns stacktrace Stacktrace(goroutineID int64, depth int, opts api.StacktraceOptions, cfg *api.LoadConfig) ([]api.Stackframe, error) // Ancestors returns ancestor stacktraces Ancestors(goroutineID int64, numAncestors int, depth int) ([]api.Ancestor, error) // AttachedToExistingProcess returns whether we attached to a running process or not AttachedToExistingProcess() bool // FindLocation returns concrete location information described by a location expression // loc ::= : | [:] | // | (+|-) | | *
// * can be the full path of a file or just a suffix // * ::= .. | .(*). | . | . | (*). | // * must be unambiguous // * // will return a location for each function matched by regex // * + returns a location for the line that is lines after the current line // * - returns a location for the line that is lines before the current line // * returns a location for a line in the current file // * *
returns the location corresponding to the specified address // NOTE: this function does not actually set breakpoints. // If findInstruction is true FindLocation will only return locations that correspond to instructions. FindLocation(scope api.EvalScope, loc string, findInstruction bool, substitutePathRules [][2]string) ([]api.Location, string, error) // DisassembleRange disassemble code between startPC and endPC DisassembleRange(scope api.EvalScope, startPC, endPC uint64, flavour api.AssemblyFlavour) (api.AsmInstructions, error) // DisassemblePC disassemble code of the function containing PC DisassemblePC(scope api.EvalScope, pc uint64, flavour api.AssemblyFlavour) (api.AsmInstructions, error) // Recorded returns true if the target is a recording. Recorded() bool // TraceDirectory returns the path to the trace directory for a recording. TraceDirectory() (string, error) // Checkpoint sets a checkpoint at the current position. Checkpoint(where string) (checkpointID int, err error) // ListCheckpoints gets all checkpoints. ListCheckpoints() ([]api.Checkpoint, error) // ClearCheckpoint removes a checkpoint ClearCheckpoint(id int) error // SetReturnValuesLoadConfig sets the load configuration for return values. SetReturnValuesLoadConfig(*api.LoadConfig) // IsMulticlient returns true if the headless instance is multiclient. IsMulticlient() bool // ListDynamicLibraries returns a list of loaded dynamic libraries. ListDynamicLibraries() ([]api.Image, error) // ExamineMemory returns the raw memory stored at the given address. // The amount of data to be read is specified by length which must be less than or equal to 1000. // This function will return an error if it reads less than `length` bytes. ExamineMemory(address uint64, length int) ([]byte, bool, error) // StopRecording stops a recording if one is in progress. StopRecording() error // CoreDumpStart starts creating a core dump to the specified file CoreDumpStart(dest string) (api.DumpState, error) // CoreDumpWait waits for the core dump to finish, or for the specified amount of milliseconds CoreDumpWait(msec int) api.DumpState // CoreDumpCancel cancels a core dump in progress CoreDumpCancel() error // ListTargets returns the list of connected targets ListTargets() ([]api.Target, error) // FollowExec enables or disables the follow exec mode. In follow exec mode // Delve will automatically debug child processes launched by the target // process FollowExec(bool, string) error FollowExecEnabled() bool // Disconnect closes the connection to the server without sending a Detach request first. // If cont is true a continue command will be sent instead. Disconnect(cont bool) error // SetDebugInfoDirectories sets directories used to search for debug symbols SetDebugInfoDirectories([]string) error // GetDebugInfoDirectories returns the list of directories used to search for debug symbols GetDebugInfoDirectories() ([]string, error) // GuessSubstitutePath tries to guess a substitute-path configuration for the client GuessSubstitutePath() ([][2]string, error) // CallAPI allows calling an arbitrary rpc method (used by starlark bindings) CallAPI(method string, args, reply interface{}) error }