From 136f4de4b813aa238b3d83f3c0eba78b14ac2bb9 Mon Sep 17 00:00:00 2001 From: aarzilli Date: Thu, 16 Jul 2020 14:53:59 +0200 Subject: [PATCH] proc: keep track of nesting depth while reading compile units Fully read compile units that contain nested entries we don't understand (such as DW_TAG_namespace) by keeping track of the depth we're at. --- pkg/proc/bininfo.go | 13 ++++++++++++- pkg/proc/dwarf_export_test.go | 6 ++++++ pkg/proc/dwarf_expr_test.go | 16 ++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 pkg/proc/dwarf_export_test.go diff --git a/pkg/proc/bininfo.go b/pkg/proc/bininfo.go index 2eebab01..e88107dd 100644 --- a/pkg/proc/bininfo.go +++ b/pkg/proc/bininfo.go @@ -1618,6 +1618,8 @@ func (bi *BinaryInfo) loadDebugInfoMaps(image *Image, debugLineBytes []byte, wg func (bi *BinaryInfo) loadDebugInfoMapsCompileUnit(ctxt *loadDebugInfoMapsContext, image *Image, reader *reader.Reader, cu *compileUnit) { hasAttrGoPkgName := goversion.ProducerAfterOrEqual(cu.producer, 1, 13) + depth := 0 + for entry, err := reader.Next(); entry != nil; entry, err = reader.Next() { if err != nil { image.setLoadError("error reading debug_info: %v", err) @@ -1625,7 +1627,11 @@ func (bi *BinaryInfo) loadDebugInfoMapsCompileUnit(ctxt *loadDebugInfoMapsContex } switch entry.Tag { case 0: - return + if depth == 0 { + return + } else { + depth-- + } case dwarf.TagImportedUnit: bi.loadDebugInfoMapsImportedUnit(entry, ctxt, image, cu) reader.SkipChildren() @@ -1695,6 +1701,11 @@ func (bi *BinaryInfo) loadDebugInfoMapsCompileUnit(ctxt *loadDebugInfoMapsContex bi.addConcreteSubprogram(entry, ctxt, reader, cu) } } + + default: + if entry.Children { + depth++ + } } } } diff --git a/pkg/proc/dwarf_export_test.go b/pkg/proc/dwarf_export_test.go new file mode 100644 index 00000000..de8f505a --- /dev/null +++ b/pkg/proc/dwarf_export_test.go @@ -0,0 +1,6 @@ +package proc + +// PackageVars returns bi.packageVars (for tests) +func (bi *BinaryInfo) PackageVars() []packageVar { + return bi.packageVars +} diff --git a/pkg/proc/dwarf_expr_test.go b/pkg/proc/dwarf_expr_test.go index 359a71a0..2410ecc5 100644 --- a/pkg/proc/dwarf_expr_test.go +++ b/pkg/proc/dwarf_expr_test.go @@ -337,3 +337,19 @@ func TestUnsupportedType(t *testing.T) { t.Errorf("unexpected error reading unsupported type: %#v", err) } } + +func TestNestedCompileUnts(t *testing.T) { + // Tests that a compile unit with a nested entry that we don't care about + // (such as a DW_TAG_namespace) is read fully. + dwb := dwarfbuilder.New() + dwb.AddCompileUnit("main", 0x0) + dwb.TagOpen(dwarf.TagNamespace, "namespace") + dwb.AddVariable("var1", 0x0, uint64(0x0)) + dwb.TagClose() + dwb.AddVariable("var2", 0x0, uint64(0x0)) + dwb.TagClose() + bi, _ := fakeBinaryInfo(t, dwb) + if n := len(bi.PackageVars()); n != 2 { + t.Errorf("expected 2 variables, got %d", n) + } +} -- GitLab