// Fetches all variables of a specific type in the current function scope func (thread *Thread) variablesByTag(tag dwarf.Tag) ([]*Variable, error) { pc, err := thread.PC() if err != nil { return nil, err } reader := thread.dbp.DwarfReader() _, err = reader.SeekToFunction(pc) if err != nil { return nil, err } vars := make([]*Variable, 0) for entry, err := reader.NextScopeVariable(); entry != nil; entry, err = reader.NextScopeVariable() { if err != nil { return nil, err } if entry.Tag == tag { val, err := thread.extractVariableFromEntry(entry) if err != nil { // skip variables that we can't parse yet continue } vars = append(vars, val) } } return vars, nil }
// Fetches all variables of a specific type in the current function scope func (scope *EvalScope) variablesByTag(tag dwarf.Tag, cfg LoadConfig) ([]*Variable, error) { reader := scope.DwarfReader() _, err := reader.SeekToFunction(scope.PC) if err != nil { return nil, err } var vars []*Variable for entry, err := reader.NextScopeVariable(); entry != nil; entry, err = reader.NextScopeVariable() { if err != nil { return nil, err } if entry.Tag == tag { val, err := scope.extractVariableFromEntry(entry, cfg) if err != nil { // skip variables that we can't parse yet continue } vars = append(vars, val) } } return vars, nil }
// Returns the value of the named variable. func (thread *Thread) EvalVariable(name string) (*Variable, error) { pc, err := thread.PC() if err != nil { return nil, err } reader := thread.dbp.DwarfReader() _, err = reader.SeekToFunction(pc) if err != nil { return nil, err } varName := name memberName := "" if strings.Contains(name, ".") { idx := strings.Index(name, ".") varName = name[:idx] memberName = name[idx+1:] } for entry, err := reader.NextScopeVariable(); entry != nil; entry, err = reader.NextScopeVariable() { if err != nil { return nil, err } n, ok := entry.Val(dwarf.AttrName).(string) if !ok { continue } if n == varName { if len(memberName) == 0 { return thread.extractVariableFromEntry(entry) } return thread.evaluateStructMember(entry, reader, memberName) } } // Attempt to evaluate name as a package variable. if memberName != "" { return thread.EvalPackageVariable(name) } else { loc, err := thread.Location() if err == nil && loc.Fn != nil { v, err := thread.EvalPackageVariable(loc.Fn.PackageName() + "." + name) if err == nil { v.Name = name return v, nil } } } return nil, fmt.Errorf("could not find symbol value for %s", name) }
// Returns the value of the named variable. func (thread *Thread) EvalVariable(name string) (*Variable, error) { pc, err := thread.PC() if err != nil { return nil, err } reader := thread.dbp.DwarfReader() _, err = reader.SeekToFunction(pc) if err != nil { return nil, err } varName := name memberName := "" if strings.Contains(name, ".") { idx := strings.Index(name, ".") varName = name[:idx] memberName = name[idx+1:] } for entry, err := reader.NextScopeVariable(); entry != nil; entry, err = reader.NextScopeVariable() { if err != nil { return nil, err } n, ok := entry.Val(dwarf.AttrName).(string) if !ok { continue } if n == varName { if len(memberName) == 0 { return thread.extractVariableFromEntry(entry) } return thread.evaluateStructMember(entry, reader, memberName) } } return nil, fmt.Errorf("could not find symbol value for %s", name) }
func (scope *EvalScope) extractVarInfo(varName string) (*Variable, error) { reader := scope.DwarfReader() _, err := reader.SeekToFunction(scope.PC) if err != nil { return nil, err } for entry, err := reader.NextScopeVariable(); entry != nil; entry, err = reader.NextScopeVariable() { if err != nil { return nil, err } n, ok := entry.Val(dwarf.AttrName).(string) if !ok { continue } if n == varName { return scope.extractVarInfoFromEntry(entry, reader) } } return nil, fmt.Errorf("could not find symbol value for %s", varName) }