diff --git a/proc/proc_test.go b/proc/proc_test.go index 44179e4164f45c731c5ecd99caae6258dc76f9d3..43499c9f46b840552af6623dd6359d050778bb87 100644 --- a/proc/proc_test.go +++ b/proc/proc_test.go @@ -1576,3 +1576,24 @@ func TestIssue414(t *testing.T) { } }) } + +func TestPackageVariables(t *testing.T) { + withTestProcess("testvariables", t, func(p *Process, fixture protest.Fixture) { + err := p.Continue() + assertNoError(err, t, "Continue()") + scope, err := p.CurrentThread.Scope() + assertNoError(err, t, "Scope()") + vars, err := scope.PackageVariables() + assertNoError(err, t, "PackageVariables()") + failed := false + for _, v := range vars { + if v.Unreadable != nil { + failed = true + t.Logf("Unreadable variable %s: %v", v.Name, v.Unreadable) + } + } + if failed { + t.Fatalf("previous errors") + } + }) +} diff --git a/proc/variables.go b/proc/variables.go index 1e0a06692d072fa7c1471ad21a2d7284b38855a6..a6856cf593c9721449e9b3af751d6c01a4ab1409 100644 --- a/proc/variables.go +++ b/proc/variables.go @@ -541,11 +541,21 @@ func (scope *EvalScope) PackageVariables() ([]*Variable, error) { var vars []*Variable reader := scope.DwarfReader() + var utypoff dwarf.Offset + utypentry, err := reader.SeekToTypeNamed("") + if err == nil { + utypoff = utypentry.Offset + } + for entry, err := reader.NextPackageVariable(); entry != nil; entry, err = reader.NextPackageVariable() { if err != nil { return nil, err } + if typoff, ok := entry.Val(dwarf.AttrType).(dwarf.Offset); !ok || typoff == utypoff { + continue + } + // Ignore errors trying to extract values val, err := scope.extractVariableFromEntry(entry) if err != nil {