Documentation ¶
Overview ¶
Package proc is a low-level package that provides methods to manipulate the process we are debugging.
proc implements all core functionality including: * creating / attaching to a process * process manipulation (step, next, continue, halt) * methods to explore the memory of the process
Index ¶
- Constants
- Variables
- func Continue(dbp Process) error
- func EvalExpressionWithCalls(p Process, g *G, expr string, retLoadCfg LoadConfig, checkEscape bool) error
- func FindDeferReturnCalls(text []AsmInstruction) []uint64
- func FindFileLocation(p Process, fileName string, lineno int) (uint64, error)
- func FindFunctionLocation(p Process, funcName string, lineOffset int) (uint64, error)
- func FirstPCAfterPrologue(p Process, fn *Function, sameline bool) (uint64, error)
- func GetDwarfRegister(regs Registers, i int) []byte
- func Next(dbp Process) (err error)
- func PostInitializationSetup(p Process, path string, debugInfoDirs []string, ...) error
- func SameGoroutineCondition(g *G) ast.Expr
- func Step(dbp Process) (err error)
- func StepOut(dbp Process) error
- type AMD64
- func (a *AMD64) AddrAndStackRegsToDwarfRegisters(staticBase, pc, sp, bp uint64) op.DwarfRegisters
- func (a *AMD64) BreakpointInstruction() []byte
- func (a *AMD64) BreakpointSize() int
- func (a *AMD64) DerefTLS() bool
- func (a *AMD64) FixFrameUnwindContext(fctxt *frame.FrameContext, pc uint64, bi *BinaryInfo) *frame.FrameContext
- func (a *AMD64) PtrSize() int
- func (a *AMD64) RegSize(regnum uint64) int
- func (a *AMD64) RegistersToDwarfRegisters(staticBase uint64, regs Registers) op.DwarfRegisters
- type Ancestor
- type Arch
- type AsmInstruction
- type AssemblyFlavour
- type BinaryInfo
- func (bi *BinaryInfo) AddImage(path string, addr uint64) error
- func (bi *BinaryInfo) AllPCsForFileLine(filename string, lineno int) []uint64
- func (bi *BinaryInfo) AllPCsForFileLines(filename string, linenos []int) map[int][]uint64
- func (bi *BinaryInfo) Close() error
- func (bi *BinaryInfo) GStructOffset() uint64
- func (bi *BinaryInfo) LastModified() time.Time
- func (bi *BinaryInfo) LineToPC(filename string, lineno int) (pc uint64, fn *Function, err error)
- func (bi *BinaryInfo) LoadBinaryInfo(path string, entryPoint uint64, debugInfoDirs []string) error
- func (bi *BinaryInfo) LoadImageFromData(dwdata *dwarf.Data, debugFrameBytes, debugLineBytes, debugLocBytes []byte)
- func (bi *BinaryInfo) Location(entry reader.Entry, attr dwarf.Attr, pc uint64, regs op.DwarfRegisters) (int64, []op.Piece, string, error)
- func (bi *BinaryInfo) LocationCovers(entry *dwarf.Entry, attr dwarf.Attr) ([][2]uint64, error)
- func (bi *BinaryInfo) PCToFunc(pc uint64) *Function
- func (bi *BinaryInfo) PCToImage(pc uint64) *Image
- func (bi *BinaryInfo) PCToLine(pc uint64) (string, int, *Function)
- func (bi *BinaryInfo) Producer() string
- func (bi *BinaryInfo) Types() ([]string, error)
- type Breakpoint
- type BreakpointExistsError
- type BreakpointKind
- type BreakpointManipulation
- type BreakpointMap
- func (bpmap *BreakpointMap) Clear(addr uint64, clearBreakpoint clearBreakpointFn) (*Breakpoint, error)
- func (bpmap *BreakpointMap) ClearInternalBreakpoints(clearBreakpoint clearBreakpointFn) error
- func (bpmap *BreakpointMap) HasInternalBreakpoints() bool
- func (bpmap *BreakpointMap) ResetBreakpointIDCounter()
- func (bpmap *BreakpointMap) Set(addr uint64, kind BreakpointKind, cond ast.Expr, ...) (*Breakpoint, error)
- func (bpmap *BreakpointMap) SetWithID(id int, addr uint64, writeBreakpoint WriteBreakpointFn) (*Breakpoint, error)
- type BreakpointState
- type Checkpoint
- type CommonProcess
- type CommonThread
- type Defer
- type Direction
- type ElfDynamicSection
- type ErrFunctionNotFound
- type ErrNoBuildIDNote
- type ErrNoGoroutine
- type ErrNoSourceForPC
- type ErrProcessExited
- type ErrThreadBlocked
- type EvalScope
- func (scope *EvalScope) DwarfReader() *reader.Reader
- func (scope *EvalScope) EvalExpression(expr string, cfg LoadConfig) (*Variable, error)
- func (scope *EvalScope) EvalVariable(name string, cfg LoadConfig) (*Variable, error)
- func (scope *EvalScope) FunctionArguments(cfg LoadConfig) ([]*Variable, error)
- func (scope *EvalScope) LocalVariables(cfg LoadConfig) ([]*Variable, error)
- func (scope *EvalScope) Locals() ([]*Variable, error)
- func (scope *EvalScope) PackageVariables(cfg LoadConfig) ([]*Variable, error)
- func (scope *EvalScope) PtrSize() int
- func (scope *EvalScope) SetVariable(name, value string) error
- type Function
- type G
- type GoroutineInfo
- type Image
- type Info
- type InvalidAddressError
- type IsNilErr
- type LoadConfig
- type Location
- type MemoryReadWriter
- type MemoryReader
- type NoBreakpointError
- type NullAddrError
- type Process
- type ProcessDetachedError
- type ProcessManipulation
- type RecordingManipulation
- type Register
- func AppendDwordReg(regs []Register, name string, value uint32) []Register
- func AppendEflagReg(regs []Register, name string, value uint64) []Register
- func AppendMxcsrReg(regs []Register, name string, value uint64) []Register
- func AppendQwordReg(regs []Register, name string, value uint64) []Register
- func AppendSSEReg(regs []Register, name string, xmm []byte) []Register
- func AppendWordReg(regs []Register, name string, value uint16) []Register
- func AppendX87Reg(regs []Register, index int, exponent uint16, mantissa uint64) []Register
- type Registers
- type Stackframe
- type Thread
- type ThreadInfo
- type Variable
- type WriteBreakpointFn
Constants ¶
const ( // GNUFlavour will display GNU assembly syntax. GNUFlavour = AssemblyFlavour(iota) // IntelFlavour will display Intel assembly syntax. IntelFlavour // GoFlavour will display Go assembly syntax. GoFlavour )
const ( // UnrecoveredPanic is the name given to the unrecovered panic breakpoint. UnrecoveredPanic = "unrecovered-panic" // FatalThrow is the name given to the breakpoint triggered when the target process dies because of a fatal runtime error FatalThrow = "runtime-fatal-throw" )
const ( // FloatIsNormal means the value is a normal float. FloatIsNormal floatSpecial = iota // FloatIsNaN means the float is a special NaN value. FloatIsNaN // FloatIsPosInf means the float is a special positive inifitiy value. FloatIsPosInf // FloatIsNegInf means the float is a special negative infinity value. FloatIsNegInf )
const ( // VariableEscaped is set for local variables that escaped to the heap // // 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. VariableEscaped variableFlags = (1 << iota) // VariableShadowed is set for local variables that are shadowed by a // variable with the same name in another scope VariableShadowed // VariableConstant means this variable is a constant value VariableConstant // VariableArgument means this variable is a function argument VariableArgument // VariableReturnArgument means this variable is a function return value VariableReturnArgument // VariableFakeAddress means the address of this variable is either fake // (i.e. the variable is partially or completely stored in a CPU register // and doesn't have a real address) or possibly no longer availabe (because // the variable is the return value of a function call and allocated on a // frame that no longer exists) VariableFakeAddress )
const ( Gidle uint64 = iota // 0 Grunnable // 1 runnable and on a run queue Grunning // 2 Gsyscall // 3 Gwaiting // 4 GmoribundUnused // 5 currently unused, but hardcoded in gdb scripts Gdead // 6 Genqueue // 7 Only the Gscanenqueue is used. Gcopystack // 8 in this state when newstack is moving the stack )
G status, from: src/runtime/runtime2.go
Variables ¶
var ErrCouldNotDetermineRelocation = errors.New("could not determine the base address of a PIE")
ErrCouldNotDetermineRelocation is an error returned when Delve could not determine the base address of a position independant executable.
var ErrNoDebugInfoFound = errors.New("could not open debug info")
ErrNoDebugInfoFound is returned when Delve cannot open the debug_info section or find an external debug info file.
var ErrNotExecutable = errors.New("not an executable file")
ErrNotExecutable is returned after attempting to execute a non-executable file to begin a debug session.
var ErrNotRecorded = errors.New("not a recording")
ErrNotRecorded is returned when an action is requested that is only possible on recorded (traced) programs.
var ErrUnknownRegister = errors.New("unknown register")
ErrUnknownRegister is returned when the value of an unknown register is requested.
var ErrUnsupportedDarwinArch = errors.New("unsupported architecture - only darwin/amd64 is supported")
ErrUnsupportedDarwinArch is returned when attempting to debug a binary compiled for an unsupported architecture.
var ErrUnsupportedLinuxArch = errors.New("unsupported architecture - only linux/amd64 is supported")
ErrUnsupportedLinuxArch is returned when attempting to debug a binary compiled for an unsupported architecture.
var ErrUnsupportedWindowsArch = errors.New("unsupported architecture of windows/386 - only windows/amd64 is supported")
ErrUnsupportedWindowsArch is returned when attempting to debug a binary compiled for an unsupported architecture.
Functions ¶
func Continue ¶ added in v1.0.0
Continue continues execution of the debugged process. It will continue until it hits a breakpoint or is otherwise stopped.
func EvalExpressionWithCalls ¶ added in v1.3.0
func EvalExpressionWithCalls(p Process, g *G, expr string, retLoadCfg LoadConfig, checkEscape bool) error
EvalExpressionWithCalls is like EvalExpression but allows function calls in 'expr'. Because this can only be done in the current goroutine, unlike EvalExpression, EvalExpressionWithCalls is not a method of EvalScope.
func FindDeferReturnCalls ¶ added in v1.3.0
func FindDeferReturnCalls(text []AsmInstruction) []uint64
func FindFileLocation ¶ added in v1.0.0
FindFileLocation returns the PC for a given file:line. Assumes that `file` is normalized to lower case and '/' on Windows.
func FindFunctionLocation ¶ added in v1.0.0
FindFunctionLocation finds address of a function's line If lineOffset is passed FindFunctionLocation will return the address of that line
func FirstPCAfterPrologue ¶ added in v1.0.0
FirstPCAfterPrologue returns the address of the first instruction after the prologue for function fn. If sameline is set FirstPCAfterPrologue will always return an address associated with the same line as fn.Entry.
func GetDwarfRegister ¶ added in v1.0.0
GetDwarfRegister maps between DWARF register numbers and architecture registers. The mapping is specified in the System V ABI AMD64 Architecture Processor Supplement page 57, figure 3.36 https://www.uclibc.org/docs/psABI-x86_64.pdf
func PostInitializationSetup ¶ added in v1.2.0
func PostInitializationSetup(p Process, path string, debugInfoDirs []string, writeBreakpoint WriteBreakpointFn) error
PostInitializationSetup handles all of the initialization procedures that must happen after Delve creates or attaches to a process.
func SameGoroutineCondition ¶ added in v1.0.0
SameGoroutineCondition returns an expression that evaluates to true when the current goroutine is g.
Types ¶
type AMD64 ¶
type AMD64 struct {
// contains filtered or unexported fields
}
AMD64 represents the AMD64 CPU architecture.
func (*AMD64) AddrAndStackRegsToDwarfRegisters ¶ added in v1.3.0
func (a *AMD64) AddrAndStackRegsToDwarfRegisters(staticBase, pc, sp, bp uint64) op.DwarfRegisters
AddrAndStackRegsToDwarfRegisters returns DWARF registers from the passed in PC, SP, and BP registers in the format used by the DWARF expression interpreter.
func (*AMD64) BreakpointInstruction ¶
BreakpointInstruction returns the Breakpoint instruction for this architecture.
func (*AMD64) BreakpointSize ¶
BreakpointSize returns the size of the breakpoint instruction on this architecture.
func (*AMD64) DerefTLS ¶ added in v1.0.0
DerefTLS returns true if the value of regs.TLS()+GStructOffset() is a pointer to the G struct
func (*AMD64) FixFrameUnwindContext ¶ added in v1.0.0
func (a *AMD64) FixFrameUnwindContext(fctxt *frame.FrameContext, pc uint64, bi *BinaryInfo) *frame.FrameContext
FixFrameUnwindContext adds default architecture rules to fctxt or returns the default frame unwind context if fctxt is nil.
func (*AMD64) RegSize ¶ added in v1.0.0
RegSize returns the size (in bytes) of register regnum. The mapping between hardware registers and DWARF registers is specified in the System V ABI AMD64 Architecture Processor Supplement page 57, figure 3.36 https://www.uclibc.org/docs/psABI-x86_64.pdf
func (*AMD64) RegistersToDwarfRegisters ¶ added in v1.0.0
func (a *AMD64) RegistersToDwarfRegisters(staticBase uint64, regs Registers) op.DwarfRegisters
RegistersToDwarfRegisters converts hardware registers to the format used by the DWARF expression interpreter.
type Ancestor ¶ added in v1.3.0
type Ancestor struct { ID int64 // Goroutine ID Unreadable error // contains filtered or unexported fields }
type Arch ¶
type Arch interface { PtrSize() int BreakpointInstruction() []byte BreakpointSize() int DerefTLS() bool FixFrameUnwindContext(*frame.FrameContext, uint64, *BinaryInfo) *frame.FrameContext RegSize(uint64) int RegistersToDwarfRegisters(uint64, Registers) op.DwarfRegisters AddrAndStackRegsToDwarfRegisters(uint64, uint64, uint64, uint64) op.DwarfRegisters }
Arch defines an interface for representing a CPU architecture.
type AsmInstruction ¶
type AsmInstruction struct { Loc Location DestLoc *Location Bytes []byte Breakpoint bool AtPC bool Inst *archInst }
AsmInstruction represents one assembly instruction.
func Disassemble ¶ added in v1.0.0
func Disassemble(mem MemoryReadWriter, regs Registers, breakpoints *BreakpointMap, bi *BinaryInfo, startAddr, endAddr uint64) ([]AsmInstruction, error)
Disassemble disassembles target memory between startAddr and endAddr, marking the current instruction being executed in goroutine g. If currentGoroutine is set and thread is stopped at a CALL instruction Disassemble will evaluate the argument of the CALL instruction using the thread's registers. Be aware that the Bytes field of each returned instruction is a slice of a larger array of size startAddr - endAddr.
func (*AsmInstruction) IsCall ¶
func (inst *AsmInstruction) IsCall() bool
IsCall returns true if the instruction is a CALL or LCALL instruction.
func (*AsmInstruction) IsRet ¶ added in v1.2.0
func (inst *AsmInstruction) IsRet() bool
IsRet returns true if the instruction is a RET or LRET instruction.
func (*AsmInstruction) Text ¶
func (inst *AsmInstruction) Text(flavour AssemblyFlavour, bi *BinaryInfo) string
Text will return the assembly instructions in human readable format according to the flavour specified.
type BinaryInfo ¶
type BinaryInfo struct { // Architecture of this binary. Arch Arch // GOOS operating system this binary is executing on. GOOS string // Functions is a list of all DW_TAG_subprogram entries in debug_info, sorted by entry point Functions []Function // Sources is a list of all source files found in debug_line. Sources []string // LookupFunc maps function names to a description of the function. LookupFunc map[string]*Function // Images is a list of loaded shared libraries (also known as // shared objects on linux or DLLs on windows). Images []*Image ElfDynamicSection ElfDynamicSection // contains filtered or unexported fields }
BinaryInfo holds information on the binaries being executed (this includes both the executable and also any loaded libraries).
func NewBinaryInfo ¶
func NewBinaryInfo(goos, goarch string) *BinaryInfo
NewBinaryInfo returns an initialized but unloaded BinaryInfo struct.
func (*BinaryInfo) AddImage ¶ added in v1.3.0
func (bi *BinaryInfo) AddImage(path string, addr uint64) error
AddImage adds the specified image to bi, loading data asynchronously. Addr is the relocated entry point for the executable and staticBase (i.e. the relocation offset) for all other images. The first image added must be the executable file.
func (*BinaryInfo) AllPCsForFileLine ¶ added in v1.1.0
func (bi *BinaryInfo) AllPCsForFileLine(filename string, lineno int) []uint64
AllPCsForFileLine returns all PC addresses for the given filename:lineno.
func (*BinaryInfo) AllPCsForFileLines ¶ added in v1.3.0
func (bi *BinaryInfo) AllPCsForFileLines(filename string, linenos []int) map[int][]uint64
AllPCsForFileLines returns a map providing all PC addresses for filename and each line in linenos
func (*BinaryInfo) GStructOffset ¶ added in v1.0.0
func (bi *BinaryInfo) GStructOffset() uint64
GStructOffset returns the offset of the G struct in thread local storage.
func (*BinaryInfo) LastModified ¶
func (bi *BinaryInfo) LastModified() time.Time
LastModified returns the last modified time of the binary.
func (*BinaryInfo) LoadBinaryInfo ¶
func (bi *BinaryInfo) LoadBinaryInfo(path string, entryPoint uint64, debugInfoDirs []string) error
LoadBinaryInfo will load and store the information from the binary at 'path'.
func (*BinaryInfo) LoadImageFromData ¶ added in v1.3.0
func (bi *BinaryInfo) LoadImageFromData(dwdata *dwarf.Data, debugFrameBytes, debugLineBytes, debugLocBytes []byte)
LoadImageFromData creates a new Image, using the specified data, and adds it to bi. This is used for debugging BinaryInfo, you should use LoadBinary instead.
func (*BinaryInfo) Location ¶ added in v1.0.0
func (bi *BinaryInfo) Location(entry reader.Entry, attr dwarf.Attr, pc uint64, regs op.DwarfRegisters) (int64, []op.Piece, string, error)
Location returns the location described by attribute attr of entry. This will either be an int64 address or a slice of Pieces for locations that don't correspond to a single memory address (registers, composite locations).
func (*BinaryInfo) LocationCovers ¶ added in v1.3.0
LocationCovers returns the list of PC addresses that is covered by the location attribute 'attr' of entry 'entry'.
func (*BinaryInfo) PCToFunc ¶ added in v1.0.0
func (bi *BinaryInfo) PCToFunc(pc uint64) *Function
PCToFunc returns the function containing the given PC address
func (*BinaryInfo) PCToImage ¶ added in v1.3.0
func (bi *BinaryInfo) PCToImage(pc uint64) *Image
PCToImage returns the image containing the given PC address.
func (*BinaryInfo) PCToLine ¶
func (bi *BinaryInfo) PCToLine(pc uint64) (string, int, *Function)
PCToLine converts an instruction address to a file/line/function.
func (*BinaryInfo) Producer ¶ added in v1.1.0
func (bi *BinaryInfo) Producer() string
Producer returns the value of DW_AT_producer.
func (*BinaryInfo) Types ¶
func (bi *BinaryInfo) Types() ([]string, error)
Types returns list of types present in the debugged program.
type Breakpoint ¶
type Breakpoint struct { // File & line information for printing. FunctionName string File string Line int Addr uint64 // Address breakpoint is set for. OriginalData []byte // If software breakpoint, the data we replace with breakpoint instruction. Name string // User defined name of the breakpoint ID int // Monotonically increasing ID. // Kind describes whether this is an internal breakpoint (for next'ing or // stepping). // A single breakpoint can be both a UserBreakpoint and some kind of // internal breakpoint, but it can not be two different kinds of internal // breakpoint. Kind BreakpointKind // Breakpoint information Tracepoint bool // Tracepoint flag TraceReturn bool Goroutine bool // Retrieve goroutine information Stacktrace int // Number of stack frames to retrieve Variables []string // Variables to evaluate LoadArgs *LoadConfig LoadLocals *LoadConfig HitCount map[int]uint64 // Number of times a breakpoint has been reached in a certain goroutine TotalHitCount uint64 // Number of times a breakpoint has been reached // DeferReturns: when kind == NextDeferBreakpoint this breakpoint // will also check if the caller is runtime.gopanic or if the return // address is in the DeferReturns array. // Next uses NextDeferBreakpoints for the breakpoint it sets on the // deferred function, DeferReturns is populated with the // addresses of calls to runtime.deferreturn in the current // function. This ensures that the breakpoint on the deferred // function only triggers on panic or on the defer call to // the function, not when the function is called directly DeferReturns []uint64 // Cond: if not nil the breakpoint will be triggered only if evaluating Cond returns true Cond ast.Expr // contains filtered or unexported fields }
Breakpoint represents a breakpoint. Stores information on the break point including the byte of data that originally was stored at that address.
func (*Breakpoint) CheckCondition ¶ added in v1.0.0
func (bp *Breakpoint) CheckCondition(thread Thread) BreakpointState
CheckCondition evaluates bp's condition on thread.
func (*Breakpoint) IsInternal ¶ added in v1.0.0
func (bp *Breakpoint) IsInternal() bool
IsInternal returns true if bp is an internal breakpoint. User-set breakpoints can overlap with internal breakpoints, in that case both IsUser and IsInternal will be true.
func (*Breakpoint) IsUser ¶ added in v1.0.0
func (bp *Breakpoint) IsUser() bool
IsUser returns true if bp is a user-set breakpoint. User-set breakpoints can overlap with internal breakpoints, in that case both IsUser and IsInternal will be true.
func (*Breakpoint) String ¶
func (bp *Breakpoint) String() string
type BreakpointExistsError ¶
BreakpointExistsError is returned when trying to set a breakpoint at an address that already has a breakpoint set for it.
func (BreakpointExistsError) Error ¶
func (bpe BreakpointExistsError) Error() string
type BreakpointKind ¶
type BreakpointKind uint16
BreakpointKind determines the behavior of delve when the breakpoint is reached.
const ( // UserBreakpoint is a user set breakpoint UserBreakpoint BreakpointKind = (1 << iota) // NextBreakpoint is a breakpoint set by Next, Continue // will stop on it and delete it NextBreakpoint // NextDeferBreakpoint is a breakpoint set by Next on the // first deferred function. In addition to checking their condition // breakpoints of this kind will also check that the function has been // called by runtime.gopanic or through runtime.deferreturn. NextDeferBreakpoint // StepBreakpoint is a breakpoint set by Step on a CALL instruction, // Continue will set a new breakpoint (of NextBreakpoint kind) on the // destination of CALL, delete this breakpoint and then continue again StepBreakpoint )
type BreakpointManipulation ¶ added in v1.0.0
type BreakpointManipulation interface { Breakpoints() *BreakpointMap SetBreakpoint(addr uint64, kind BreakpointKind, cond ast.Expr) (*Breakpoint, error) ClearBreakpoint(addr uint64) (*Breakpoint, error) ClearInternalBreakpoints() error }
BreakpointManipulation is an interface for managing breakpoints.
type BreakpointMap ¶ added in v1.0.0
type BreakpointMap struct { M map[uint64]*Breakpoint // contains filtered or unexported fields }
BreakpointMap represents an (address, breakpoint) map.
func NewBreakpointMap ¶ added in v1.0.0
func NewBreakpointMap() BreakpointMap
NewBreakpointMap creates a new BreakpointMap.
func (*BreakpointMap) Clear ¶ added in v1.0.0
func (bpmap *BreakpointMap) Clear(addr uint64, clearBreakpoint clearBreakpointFn) (*Breakpoint, error)
Clear clears the breakpoint at addr. Do not call this function call proc.Process.ClearBreakpoint instead.
func (*BreakpointMap) ClearInternalBreakpoints ¶ added in v1.0.0
func (bpmap *BreakpointMap) ClearInternalBreakpoints(clearBreakpoint clearBreakpointFn) error
ClearInternalBreakpoints removes all internal breakpoints from the map, calling clearBreakpoint on each one. Do not call this function, call proc.Process.ClearInternalBreakpoints instead, this function is used to implement that.
func (*BreakpointMap) HasInternalBreakpoints ¶ added in v1.0.0
func (bpmap *BreakpointMap) HasInternalBreakpoints() bool
HasInternalBreakpoints returns true if bpmap has at least one internal breakpoint set.
func (*BreakpointMap) ResetBreakpointIDCounter ¶ added in v1.0.0
func (bpmap *BreakpointMap) ResetBreakpointIDCounter()
ResetBreakpointIDCounter resets the breakpoint ID counter of bpmap.
func (*BreakpointMap) Set ¶ added in v1.0.0
func (bpmap *BreakpointMap) Set(addr uint64, kind BreakpointKind, cond ast.Expr, writeBreakpoint WriteBreakpointFn) (*Breakpoint, error)
Set creates a breakpoint at addr calling writeBreakpoint. Do not call this function, call proc.Process.SetBreakpoint instead, this function exists to implement proc.Process.SetBreakpoint.
func (*BreakpointMap) SetWithID ¶ added in v1.0.0
func (bpmap *BreakpointMap) SetWithID(id int, addr uint64, writeBreakpoint WriteBreakpointFn) (*Breakpoint, error)
SetWithID creates a breakpoint at addr, with the specified ID.
type BreakpointState ¶ added in v1.0.0
type BreakpointState struct { *Breakpoint // Active is true if the breakpoint condition was met. Active bool // Internal is true if the breakpoint was matched as an internal // breakpoint. Internal bool // CondError contains any error encountered while evaluating the // breakpoint's condition. CondError error }
BreakpointState describes the state of a breakpoint in a thread.
func (*BreakpointState) Clear ¶ added in v1.0.0
func (bpstate *BreakpointState) Clear()
Clear zeros the struct.
func (*BreakpointState) String ¶ added in v1.0.0
func (bpstate *BreakpointState) String() string
type Checkpoint ¶ added in v1.0.0
Checkpoint is a checkpoint
type CommonProcess ¶ added in v1.1.0
type CommonProcess struct {
// contains filtered or unexported fields
}
CommonProcess contains fields used by this package, common to all implementations of the Process interface.
func NewCommonProcess ¶ added in v1.1.0
func NewCommonProcess(fncallEnabled bool) CommonProcess
NewCommonProcess returns a struct with fields common across all process implementations.
func (*CommonProcess) ClearAllGCache ¶ added in v1.1.0
func (p *CommonProcess) ClearAllGCache()
ClearAllGCache clears the cached contents of the cache for runtime.allgs.
type CommonThread ¶ added in v1.1.0
type CommonThread struct {
// contains filtered or unexported fields
}
CommonThread contains fields used by this package, common to all implementations of the Thread interface.
func (*CommonThread) ReturnValues ¶ added in v1.1.0
func (t *CommonThread) ReturnValues(cfg LoadConfig) []*Variable
ReturnValues reads the return values from the function executing on this thread using the provided LoadConfig.
type Defer ¶ added in v1.1.0
type Defer struct { DeferredPC uint64 // Value of field _defer.fn.fn, the deferred function DeferPC uint64 // PC address of instruction that added this defer SP uint64 // Value of SP register when this function was deferred (this field gets adjusted when the stack is moved to match the new stack space) Unreadable error // contains filtered or unexported fields }
Defer represents one deferred call
type Direction ¶ added in v1.0.0
type Direction int8
Direction is the direction of execution for the target process.
type ElfDynamicSection ¶ added in v1.3.0
type ElfDynamicSection struct { Addr uint64 // relocated address of where the .dynamic section is mapped in memory Size uint64 // size of the .dynamic section of the executable }
ElfDynamicSection describes the .dynamic section of an ELF executable.
type ErrFunctionNotFound ¶ added in v1.2.0
type ErrFunctionNotFound struct {
FuncName string
}
ErrFunctionNotFound is returned when failing to find the function named 'FuncName' within the binary.
func (*ErrFunctionNotFound) Error ¶ added in v1.2.0
func (err *ErrFunctionNotFound) Error() string
type ErrNoBuildIDNote ¶ added in v1.2.0
type ErrNoBuildIDNote struct{}
ErrNoBuildIDNote is used in openSeparateDebugInfo to signal there's no build-id note on the binary, so LoadBinaryInfoElf will return the error message coming from elfFile.DWARF() instead.
func (*ErrNoBuildIDNote) Error ¶ added in v1.2.0
func (e *ErrNoBuildIDNote) Error() string
type ErrNoGoroutine ¶ added in v1.1.0
type ErrNoGoroutine struct {
// contains filtered or unexported fields
}
ErrNoGoroutine returned when a G could not be found for a specific thread.
func (ErrNoGoroutine) Error ¶ added in v1.2.0
func (ng ErrNoGoroutine) Error() string
type ErrNoSourceForPC ¶ added in v1.2.0
type ErrNoSourceForPC struct {
// contains filtered or unexported fields
}
ErrNoSourceForPC is returned when the given address does not correspond with a source file location.
func (*ErrNoSourceForPC) Error ¶ added in v1.2.0
func (err *ErrNoSourceForPC) Error() string
type ErrProcessExited ¶ added in v1.2.0
ErrProcessExited indicates that the process has exited and contains both process id and exit status.
func (ErrProcessExited) Error ¶ added in v1.2.0
func (pe ErrProcessExited) Error() string
type ErrThreadBlocked ¶ added in v1.2.0
type ErrThreadBlocked struct{}
ErrThreadBlocked is returned when the thread is blocked in the scheduler.
func (ErrThreadBlocked) Error ¶ added in v1.2.0
func (tbe ErrThreadBlocked) Error() string
type EvalScope ¶
type EvalScope struct { Location Regs op.DwarfRegisters Mem MemoryReadWriter // Target's memory BinInfo *BinaryInfo // contains filtered or unexported fields }
EvalScope is the scope for variable evaluation. Contains the thread, current location (PC), and canonical frame address.
func ConvertEvalScope ¶ added in v1.0.0
ConvertEvalScope returns a new EvalScope in the context of the specified goroutine ID and stack frame. If deferCall is > 0 the eval scope will be relative to the specified deferred call.
func FrameToScope ¶ added in v1.0.0
func FrameToScope(bi *BinaryInfo, thread MemoryReadWriter, g *G, frames ...Stackframe) *EvalScope
FrameToScope returns a new EvalScope for frames[0]. If frames has at least two elements all memory between frames[0].Regs.SP() and frames[1].Regs.CFA will be cached. Otherwise all memory between frames[0].Regs.SP() and frames[0].Regs.CFA will be cached.
func GoroutineScope ¶ added in v1.0.0
GoroutineScope returns an EvalScope for the goroutine running on this thread.
func ThreadScope ¶ added in v1.0.0
ThreadScope returns an EvalScope for this thread.
func (*EvalScope) DwarfReader ¶
DwarfReader returns the DwarfReader containing the Dwarf information for the target process.
func (*EvalScope) EvalExpression ¶
func (scope *EvalScope) EvalExpression(expr string, cfg LoadConfig) (*Variable, error)
EvalExpression returns the value of the given expression.
func (*EvalScope) EvalVariable ¶
func (scope *EvalScope) EvalVariable(name string, cfg LoadConfig) (*Variable, error)
EvalVariable returns the value of the given expression (backwards compatibility).
func (*EvalScope) FunctionArguments ¶
func (scope *EvalScope) FunctionArguments(cfg LoadConfig) ([]*Variable, error)
FunctionArguments returns the name, value, and type of all current function arguments.
func (*EvalScope) LocalVariables ¶
func (scope *EvalScope) LocalVariables(cfg LoadConfig) ([]*Variable, error)
LocalVariables returns all local variables from the current function scope.
func (*EvalScope) Locals ¶ added in v1.1.0
Locals fetches all variables of a specific type in the current function scope.
func (*EvalScope) PackageVariables ¶
func (scope *EvalScope) PackageVariables(cfg LoadConfig) ([]*Variable, error)
PackageVariables returns the name, value, and type of all package variables in the application.
func (*EvalScope) SetVariable ¶
SetVariable sets the value of the named variable
type Function ¶ added in v1.0.0
type Function struct { Name string Entry, End uint64 // same as DW_AT_lowpc and DW_AT_highpc // contains filtered or unexported fields }
Function describes a function in the target program.
func (*Function) BaseName ¶ added in v1.0.0
BaseName returns the symbol name without the package or receiver name. Borrowed from $GOROOT/debug/gosym/symtab.go
func (*Function) Optimized ¶ added in v1.0.0
Optimized returns true if the function was optimized by the compiler.
func (*Function) PackageName ¶ added in v1.0.0
PackageName returns the package part of the symbol name, or the empty string if there is none. Borrowed from $GOROOT/debug/gosym/symtab.go
func (*Function) PrologueEndPC ¶ added in v1.3.0
PrologueEndPC returns the PC just after the function prologue
func (*Function) ReceiverName ¶ added in v1.0.0
ReceiverName returns the receiver type name of this symbol, or the empty string if there is none. Borrowed from $GOROOT/debug/gosym/symtab.go
type G ¶
type G struct { ID int // Goroutine ID PC uint64 // PC of goroutine when it was parked. SP uint64 // SP of goroutine when it was parked. BP uint64 // BP of goroutine when it was parked (go >= 1.7). GoPC uint64 // PC of 'go' statement that created this goroutine. StartPC uint64 // PC of the first function run on this goroutine. WaitReason string // Reason for goroutine being parked. Status uint64 SystemStack bool // SystemStack is true if this goroutine is currently executing on a system stack. // Information on goroutine location CurrentLoc Location // Thread that this goroutine is currently allocated to Thread Thread Unreadable error // could not read the G struct // contains filtered or unexported fields }
G represents a runtime G (goroutine) structure (at least the fields that Delve is interested in).
func FindGoroutine ¶ added in v1.0.0
FindGoroutine returns a G struct representing the goroutine specified by `gid`.
func GetG ¶ added in v1.0.0
GetG returns information on the G (goroutine) that is executing on this thread.
The G structure for a thread is stored in thread local storage. Here we simply calculate the address and read and parse the G struct.
We cannot simply use the allg linked list in order to find the M that represents the given OS thread and follow its G pointer because on Darwin mach ports are not universal, so our port for this thread would not map to the `id` attribute of the M structure. Also, when linked against libc, Go prefers the libc version of clone as opposed to the runtime version. This has the consequence of not setting M.id for any thread, regardless of OS.
In order to get around all this craziness, we read the address of the G structure for the current thread from the thread local storage area.
func GoroutinesInfo ¶ added in v1.0.0
GoroutinesInfo searches for goroutines starting at index 'start', and returns an array of up to 'count' (or all found elements, if 'count' is 0) G structures representing the information Delve care about from the internal runtime G structure. GoroutinesInfo also returns the next index to be used as 'start' argument while scanning for all available goroutines, or -1 if there was an error or if the index already reached the last possible value.
func (*G) Stacktrace ¶
func (g *G) Stacktrace(depth int, readDefers bool) ([]Stackframe, error)
Stacktrace returns the stack trace for a goroutine. Note the locations in the array are return addresses not call addresses.
func (*G) UserCurrent ¶
UserCurrent returns the location the users code is at, or was at before entering a runtime function.
type GoroutineInfo ¶ added in v1.0.0
GoroutineInfo is an interface for getting information on running goroutines.
type Image ¶ added in v1.3.0
Image represents a loaded library file (shared object on linux, DLL on windows).
func (*Image) DwarfReader ¶ added in v1.3.0
DwarfReader returns a reader for the dwarf data
type Info ¶ added in v1.0.0
type Info interface { Pid() int // ResumeNotify specifies a channel that will be closed the next time // ContinueOnce finishes resuming the target. ResumeNotify(chan<- struct{}) // Valid returns true if this Process can be used. When it returns false it // also returns an error describing why the Process is invalid (either // ErrProcessExited or ProcessDetachedError). Valid() (bool, error) BinInfo() *BinaryInfo EntryPoint() (uint64, error) // Common returns a struct with fields common to all backends Common() *CommonProcess ThreadInfo GoroutineInfo }
Info is an interface that provides general information on the target.
type InvalidAddressError ¶
type InvalidAddressError struct {
Address uint64
}
InvalidAddressError represents the result of attempting to set a breakpoint at an invalid address.
func (InvalidAddressError) Error ¶
func (iae InvalidAddressError) Error() string
type IsNilErr ¶
type IsNilErr struct {
// contains filtered or unexported fields
}
IsNilErr is returned when a variable is nil.
type LoadConfig ¶
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 // MaxMapBuckets is the maximum number of map buckets to read before giving up. // A value of 0 will read as many buckets as necessary until the entire map // is read or MaxArrayValues is reached. // // Loading a map is an operation that issues O(num_buckets) operations. // Normally the number of buckets is proportional to the number of elements // in the map, since the runtime tries to keep the load factor of maps // between 40% and 80%. // // It is possible, however, to create very sparse maps either by: // a) adding lots of entries to a map and then deleting most of them, or // b) using the make(mapType, N) expression with a very large N // // When this happens delve will have to scan many empty buckets to find the // few entries in the map. // MaxMapBuckets can be set to avoid annoying slowdowns␣while reading // very sparse maps. // // Since there is no good way for a user of delve to specify the value of // MaxMapBuckets, this field is not actually exposed through the API. // Instead (*EvalScope).LocalVariables and (*EvalScope).FunctionArguments // set this field automatically to MaxArrayValues * maxMapBucketsFactor. // Every other invocation uses the default value of 0, obtaining the old behavior. // In practice this means that debuggers using the ListLocalVars or // ListFunctionArgs API will not experience a massive slowdown when a very // sparse map is in scope, but evaluating a single variable will still work // correctly, even if the variable in question is a very sparse map. MaxMapBuckets int }
LoadConfig controls how variables are loaded from the targets memory.
type Location ¶
Location represents the location of a thread. Holds information on the current instruction address, the source file:line, and the function.
type MemoryReadWriter ¶ added in v1.0.0
type MemoryReadWriter interface { MemoryReader WriteMemory(addr uintptr, data []byte) (written int, err error) }
MemoryReadWriter is an interface for reading or writing to the targets memory. This allows us to read from the actual target memory or possibly a cache.
func DereferenceMemory ¶ added in v1.0.0
func DereferenceMemory(mem MemoryReadWriter) MemoryReadWriter
DereferenceMemory returns a MemoryReadWriter that can read and write the memory pointed to by pointers in this memory. Normally mem and mem.Dereference are the same object, they are different only if this MemoryReadWriter is used to access memory outside of the normal address space of the inferior process (such as data contained in registers, or composite memory).
type MemoryReader ¶ added in v1.0.0
type MemoryReader interface { // ReadMemory is just like io.ReaderAt.ReadAt. ReadMemory(buf []byte, addr uintptr) (n int, err error) }
MemoryReader is like io.ReaderAt, but the offset is a uintptr so that it can address all of 64-bit memory. Redundant with memoryReadWriter but more easily suited to working with the standard io package.
type NoBreakpointError ¶
type NoBreakpointError struct {
Addr uint64
}
NoBreakpointError is returned when trying to clear a breakpoint that does not exist.
func (NoBreakpointError) Error ¶
func (nbp NoBreakpointError) Error() string
type NullAddrError ¶
type NullAddrError struct{}
NullAddrError is an error for a null address.
func (NullAddrError) Error ¶
func (n NullAddrError) Error() string
type Process ¶
type Process interface { Info ProcessManipulation BreakpointManipulation RecordingManipulation }
Process represents the target of the debugger. This target could be a system process, core file, etc.
Implementations of Process are not required to be thread safe and users of Process should not assume they are. There is one exception to this rule: it is safe to call RequestManualStop concurrently with ContinueOnce.
type ProcessDetachedError ¶ added in v1.1.0
type ProcessDetachedError struct { }
ProcessDetachedError indicates that we detached from the target process.
func (ProcessDetachedError) Error ¶ added in v1.1.0
func (pe ProcessDetachedError) Error() string
type ProcessManipulation ¶ added in v1.0.0
type ProcessManipulation interface { ContinueOnce() (trapthread Thread, err error) StepInstruction() error SwitchThread(int) error SwitchGoroutine(int) error RequestManualStop() error // CheckAndClearManualStopRequest returns true the first time it's called // after a call to RequestManualStop. CheckAndClearManualStopRequest() bool Detach(bool) error }
ProcessManipulation is an interface for changing the execution state of a process.
type RecordingManipulation ¶ added in v1.0.0
type RecordingManipulation interface { // Recorded returns true if the current process is a recording and the path // to the trace directory. Recorded() (recorded bool, tracedir string) // Restart restarts the recording from the specified position, or from the // last checkpoint if pos == "". // If pos starts with 'c' it's a checkpoint ID, otherwise it's an event // number. Restart(pos string) error // Direction changes execution direction. Direction(Direction) error // When returns current recording position. When() (string, error) // Checkpoint sets a checkpoint at the current position. Checkpoint(where string) (id int, err error) // Checkpoints returns the list of currently set checkpoint. Checkpoints() ([]Checkpoint, error) // ClearCheckpoint removes a checkpoint. ClearCheckpoint(id int) error }
RecordingManipulation is an interface for manipulating process recordings.
type Register ¶
Register represents a CPU register.
func AppendDwordReg ¶ added in v1.0.0
AppendDwordReg appends a double word (32 bit) register to regs.
func AppendEflagReg ¶ added in v1.0.0
AppendEflagReg appends EFLAG register to regs.
func AppendMxcsrReg ¶ added in v1.0.0
AppendMxcsrReg appends MXCSR register to regs.
func AppendQwordReg ¶ added in v1.0.0
AppendQwordReg appends a quad word (64 bit) register to regs.
func AppendSSEReg ¶ added in v1.0.0
AppendSSEReg appends a 256 bit SSE register to regs.
func AppendWordReg ¶ added in v1.0.0
AppendWordReg appends a word (16 bit) register to regs.
type Registers ¶
type Registers interface { PC() uint64 SP() uint64 BP() uint64 CX() uint64 TLS() uint64 // GAddr returns the address of the G variable if it is known, 0 and false otherwise GAddr() (uint64, bool) Get(int) (uint64, error) Slice(floatingPoint bool) []Register // Copy returns a copy of the registers that is guaranteed not to change // when the registers of the associated thread change. Copy() Registers }
Registers is an interface for a generic register type. The interface encapsulates the generic values / actions we need independent of arch. The concrete register types will be different depending on OS/Arch.
type Stackframe ¶
type Stackframe struct {
Current, Call Location
// Frame registers.
Regs op.DwarfRegisters
// Return address for this stack frame (as read from the stack frame itself).
Ret uint64
// Err is set if an error occurred during stacktrace
Err error
// SystemStack is true if this frame belongs to a system stack.
SystemStack bool
// Inlined is true if this frame is actually an inlined call.
Inlined bool
// Bottom is true if this is the bottom of the stack
Bottom bool
// TopmostDefer is the defer that would be at the top of the stack when a
// panic unwind would get to this call frame, in other words it's the first
// deferred function that will be called if the runtime unwinds past this
// call frame.
TopmostDefer *Defer
// Defers is the list of functions deferred by this stack frame (so far).
Defers []*Defer
// contains filtered or unexported fields
}
Stackframe represents a frame in a system stack.
Each stack frame has two locations Current and Call.
For the topmost stackframe Current and Call are the same location.
For stackframes after the first Current is the location corresponding to the return address and Call is the location of the CALL instruction that was last executed on the frame. Note however that Call.PC is always equal to Current.PC, because finding the correct value for Call.PC would require disassembling each function in the stacktrace.
For synthetic stackframes generated for inlined function calls Current.Fn is the function containing the inlining and Call.Fn in the inlined function.
func ThreadStacktrace ¶ added in v1.0.0
func ThreadStacktrace(thread Thread, depth int) ([]Stackframe, error)
ThreadStacktrace returns the stack trace for thread. Note the locations in the array are return addresses not call addresses.
func (*Stackframe) FrameOffset ¶ added in v1.0.0
func (frame *Stackframe) FrameOffset() int64
FrameOffset returns the address of the stack frame, absolute for system stack frames or as an offset from stackhi for goroutine stacks (a negative value).
func (*Stackframe) FramePointerOffset ¶ added in v1.0.0
func (frame *Stackframe) FramePointerOffset() int64
FramePointerOffset returns the value of the frame pointer, absolute for system stack frames or as an offset from stackhi for goroutine stacks (a negative value).
type Thread ¶
type Thread interface { MemoryReadWriter Location() (*Location, error) // Breakpoint will return the breakpoint that this thread is stopped at or // nil if the thread is not stopped at any breakpoint. Breakpoint() BreakpointState ThreadID() int // Registers returns the CPU registers of this thread. The contents of the // variable returned may or may not change to reflect the new CPU status // when the thread is resumed or the registers are changed by calling // SetPC/SetSP/etc. // To insure that the the returned variable won't change call the Copy // method of Registers. Registers(floatingPoint bool) (Registers, error) // RestoreRegisters restores saved registers RestoreRegisters(Registers) error Arch() Arch BinInfo() *BinaryInfo StepInstruction() error // Blocked returns true if the thread is blocked Blocked() bool // SetCurrentBreakpoint updates the current breakpoint of this thread, if adjustPC is true also checks for breakpoints that were just hit (this should only be passed true after a thread resume) SetCurrentBreakpoint(adjustPC bool) error // Common returns the CommonThread structure for this thread Common() *CommonThread SetPC(uint64) error SetSP(uint64) error SetDX(uint64) error }
Thread represents a thread.
type ThreadInfo ¶ added in v1.0.0
type ThreadInfo interface { FindThread(threadID int) (Thread, bool) ThreadList() []Thread CurrentThread() Thread }
ThreadInfo is an interface for getting information on active threads in the process.
type Variable ¶
type Variable struct { Addr uintptr OnlyAddr bool Name string DwarfType godwarf.Type RealType godwarf.Type Kind reflect.Kind Value constant.Value FloatSpecial floatSpecial Len int64 Cap int64 Flags variableFlags // 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 Children []Variable Unreadable error LocationExpr string // location expression DeclLine int64 // line number of this variable's declaration // contains filtered or unexported fields }
Variable represents a variable. It contains the address, name, type and other information parsed from both the Dwarf information and the memory of the debugged process. If OnlyAddr is true, the variables value has not been loaded.
func (*Variable) ConstDescr ¶ added in v1.0.0
ConstDescr describes the value of v using constants.
func (*Variable) TypeString ¶
TypeString returns the string representation of the type of this variable.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
This package contains functions and data structures used by both the linux implementation of the native backend and the core backend to deal with structures used by the linux kernel.
|
This package contains functions and data structures used by both the linux implementation of the native backend and the core backend to deal with structures used by the linux kernel. |