mirror of
				https://github.com/go-delve/delve.git
				synced 2025-10-31 10:47:27 +08:00 
			
		
		
		
	Comment cleanup. Added info vars reference to docs
This commit is contained in:
		| @ -67,10 +67,11 @@ Once inside a debugging session, the following commands may be used: | |||||||
| * `print $var` - Evaluate a variable. | * `print $var` - Evaluate a variable. | ||||||
|  |  | ||||||
| * `info $type [regex]` - Outputs information about the symbol table. An optional regex filters the list. Example `info funcs unicode`. Valid types are: | * `info $type [regex]` - Outputs information about the symbol table. An optional regex filters the list. Example `info funcs unicode`. Valid types are: | ||||||
|   * `sources` - Prings the path of all source files |   * `args` - Prints the name and value of all arguments to the current function | ||||||
|   * `funcs` - Prings the name of all defined functions |   * `funcs` - Prings the name of all defined functions | ||||||
|   * `locals` - Prints the name and value of all local variables in the current context |   * `locals` - Prints the name and value of all local variables in the current context | ||||||
|   * `args` - Prints the name and value of all arguments to the current function |   * `sources` - Prings the path of all source files | ||||||
|  |   * `vars` - Prints the name and value of all package variables in the app. Any variable that is not local or arg is considered a package variables | ||||||
|  |  | ||||||
| * `exit` - Exit the debugger. | * `exit` - Exit the debugger. | ||||||
|  |  | ||||||
|  | |||||||
| @ -262,7 +262,7 @@ func info(p *proctl.DebuggedProcess, args ...string) error { | |||||||
| 		data = filterVariables(vars, filter) | 		data = filterVariables(vars, filter) | ||||||
|  |  | ||||||
| 	default: | 	default: | ||||||
| 		return fmt.Errorf("unsupported info type, must be sources, funcs, locals, args, or vars") | 		return fmt.Errorf("unsupported info type, must be args, funcs, locals, sources, or vars") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// sort and output data | 	// sort and output data | ||||||
|  | |||||||
| @ -10,18 +10,18 @@ type Reader struct { | |||||||
| 	depth int | 	depth int | ||||||
| } | } | ||||||
|  |  | ||||||
| // New returns a reader for the specified dwarf data | // New returns a reader for the specified dwarf data. | ||||||
| func New(data *dwarf.Data) *Reader { | func New(data *dwarf.Data) *Reader { | ||||||
| 	return &Reader{data.Reader(), 0} | 	return &Reader{data.Reader(), 0} | ||||||
| } | } | ||||||
|  |  | ||||||
| // Seek moves the reader to an arbitrary offset | // Seek moves the reader to an arbitrary offset. | ||||||
| func (reader *Reader) Seek(off dwarf.Offset) { | func (reader *Reader) Seek(off dwarf.Offset) { | ||||||
| 	reader.depth = 0 | 	reader.depth = 0 | ||||||
| 	reader.Reader.Seek(off) | 	reader.Reader.Seek(off) | ||||||
| } | } | ||||||
|  |  | ||||||
| // SeekToEntry moves the reader to an arbitrary entry | // SeekToEntry moves the reader to an arbitrary entry. | ||||||
| func (reader *Reader) SeekToEntry(entry *dwarf.Entry) error { | func (reader *Reader) SeekToEntry(entry *dwarf.Entry) error { | ||||||
| 	reader.Seek(entry.Offset) | 	reader.Seek(entry.Offset) | ||||||
| 	// Consume the current entry so .Next works as intended | 	// Consume the current entry so .Next works as intended | ||||||
| @ -62,7 +62,7 @@ func (reader *Reader) SeekToFunction(pc uint64) (*dwarf.Entry, error) { | |||||||
|  |  | ||||||
| // SeekToType moves the reader to the type specified by the entry, | // SeekToType moves the reader to the type specified by the entry, | ||||||
| // optionally resolving typedefs and pointer types. If the reader is set | // optionally resolving typedefs and pointer types. If the reader is set | ||||||
| // to a struct type the NextMemberVariable call can be used to walk all member data | // to a struct type the NextMemberVariable call can be used to walk all member data. | ||||||
| func (reader *Reader) SeekToType(entry *dwarf.Entry, resolveTypedefs bool, resolvePointerTypes bool) (*dwarf.Entry, error) { | func (reader *Reader) SeekToType(entry *dwarf.Entry, resolveTypedefs bool, resolvePointerTypes bool) (*dwarf.Entry, error) { | ||||||
| 	offset, ok := entry.Val(dwarf.AttrType).(dwarf.Offset) | 	offset, ok := entry.Val(dwarf.AttrType).(dwarf.Offset) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| @ -97,7 +97,7 @@ func (reader *Reader) SeekToType(entry *dwarf.Entry, resolveTypedefs bool, resol | |||||||
| 	return nil, fmt.Errorf("no type entry found") | 	return nil, fmt.Errorf("no type entry found") | ||||||
| } | } | ||||||
|  |  | ||||||
| // NextScopeVariable moves the reader to the next debug entry that describes a local variable and returns the entry | // NextScopeVariable moves the reader to the next debug entry that describes a local variable and returns the entry. | ||||||
| func (reader *Reader) NextScopeVariable() (*dwarf.Entry, error) { | func (reader *Reader) NextScopeVariable() (*dwarf.Entry, error) { | ||||||
| 	for entry, err := reader.Next(); entry != nil; entry, err = reader.Next() { | 	for entry, err := reader.Next(); entry != nil; entry, err = reader.Next() { | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -121,7 +121,7 @@ func (reader *Reader) NextScopeVariable() (*dwarf.Entry, error) { | |||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // NextMememberVariable moves the reader to the next debug entry that describes a member variable and returns the entry | // NextMememberVariable moves the reader to the next debug entry that describes a member variable and returns the entry. | ||||||
| func (reader *Reader) NextMemberVariable() (*dwarf.Entry, error) { | func (reader *Reader) NextMemberVariable() (*dwarf.Entry, error) { | ||||||
| 	for entry, err := reader.Next(); entry != nil; entry, err = reader.Next() { | 	for entry, err := reader.Next(); entry != nil; entry, err = reader.Next() { | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -145,8 +145,8 @@ func (reader *Reader) NextMemberVariable() (*dwarf.Entry, error) { | |||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // NextPackage moves the reader to the next debug entry that describes a package variable | // NextPackageVariable moves the reader to the next debug entry that describes a package variable. | ||||||
| // any TagVariable entry that is not inside a sub prgram entry and is marked external is considered a package variable | // Any TagVariable entry that is not inside a sub prgram entry and is marked external is considered a package variable. | ||||||
| func (reader *Reader) NextPackageVariable() (*dwarf.Entry, error) { | func (reader *Reader) NextPackageVariable() (*dwarf.Entry, error) { | ||||||
| 	for entry, err := reader.Next(); entry != nil; entry, err = reader.Next() { | 	for entry, err := reader.Next(); entry != nil; entry, err = reader.Next() { | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|  | |||||||
| @ -361,6 +361,38 @@ func (thread *ThreadContext) EvalSymbol(name string) (*Variable, error) { | |||||||
| 	return nil, fmt.Errorf("could not find symbol value for %s", name) | 	return nil, fmt.Errorf("could not find symbol value for %s", name) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // LocalVariables returns all local variables from the current function scope. | ||||||
|  | func (thread *ThreadContext) LocalVariables() ([]*Variable, error) { | ||||||
|  | 	return thread.variablesByTag(dwarf.TagVariable) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // FunctionArguments returns the name, value, and type of all current function arguments. | ||||||
|  | func (thread *ThreadContext) FunctionArguments() ([]*Variable, error) { | ||||||
|  | 	return thread.variablesByTag(dwarf.TagFormalParameter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // PackageVariables returns the name, value, and type of all package variables in the application. | ||||||
|  | func (thread *ThreadContext) PackageVariables() ([]*Variable, error) { | ||||||
|  | 	reader := thread.Process.DwarfReader() | ||||||
|  |  | ||||||
|  | 	vars := make([]*Variable, 0) | ||||||
|  |  | ||||||
|  | 	for entry, err := reader.NextPackageVariable(); entry != nil; entry, err = reader.NextPackageVariable() { | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Ignore errors trying to extract values | ||||||
|  | 		val, err := thread.extractVariableFromEntry(entry) | ||||||
|  | 		if err != nil { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		vars = append(vars, val) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return vars, nil | ||||||
|  | } | ||||||
|  |  | ||||||
| func findDwarfEntry(name string, reader *dwarf.Reader, member bool) (*dwarf.Entry, error) { | func findDwarfEntry(name string, reader *dwarf.Reader, member bool) (*dwarf.Entry, error) { | ||||||
| 	depth := 1 | 	depth := 1 | ||||||
| 	for entry, err := reader.Next(); entry != nil; entry, err = reader.Next() { | 	for entry, err := reader.Next(); entry != nil; entry, err = reader.Next() { | ||||||
| @ -924,38 +956,6 @@ func (thread *ThreadContext) variablesByTag(tag dwarf.Tag) ([]*Variable, error) | |||||||
| 	return vars, nil | 	return vars, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // LocalVariables returns all local variables from the current function scope |  | ||||||
| func (thread *ThreadContext) LocalVariables() ([]*Variable, error) { |  | ||||||
| 	return thread.variablesByTag(dwarf.TagVariable) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // FunctionArguments returns the name, value, and type of all current function arguments |  | ||||||
| func (thread *ThreadContext) FunctionArguments() ([]*Variable, error) { |  | ||||||
| 	return thread.variablesByTag(dwarf.TagFormalParameter) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // PackageVariables returns the name, value, and type of all package variables in the application |  | ||||||
| func (thread *ThreadContext) PackageVariables() ([]*Variable, error) { |  | ||||||
| 	reader := thread.Process.DwarfReader() |  | ||||||
|  |  | ||||||
| 	vars := make([]*Variable, 0) |  | ||||||
|  |  | ||||||
| 	for entry, err := reader.NextPackageVariable(); entry != nil; entry, err = reader.NextPackageVariable() { |  | ||||||
| 		if err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// Ignore errors trying to extract values |  | ||||||
| 		val, err := thread.extractVariableFromEntry(entry) |  | ||||||
| 		if err != nil { |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		vars = append(vars, val) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return vars, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Sets the length of a slice. | // Sets the length of a slice. | ||||||
| func setSliceLength(ptr unsafe.Pointer, l int) { | func setSliceLength(ptr unsafe.Pointer, l int) { | ||||||
| 	lptr := (*int)(unsafe.Pointer(uintptr(ptr) + ptrsize)) | 	lptr := (*int)(unsafe.Pointer(uintptr(ptr) + ptrsize)) | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 epipho
					epipho