From a38f50da45a76b90b55a7520b5cc8fa29d5deb30 Mon Sep 17 00:00:00 2001 From: aarzilli Date: Mon, 15 Nov 2021 09:31:27 +0100 Subject: [PATCH] proc: log errors reading debug_info Because of an incorrect use of debug/dwarf.Reader errors encountered while reading debug_info were not reported. Updates #2786 --- pkg/proc/bininfo.go | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/pkg/proc/bininfo.go b/pkg/proc/bininfo.go index f60ae51535..d584d57649 100644 --- a/pkg/proc/bininfo.go +++ b/pkg/proc/bininfo.go @@ -911,10 +911,11 @@ func (image *Image) Close() error { return err2 } -func (image *Image) setLoadError(fmtstr string, args ...interface{}) { +func (image *Image) setLoadError(logger *logrus.Entry, fmtstr string, args ...interface{}) { image.loadErrMu.Lock() image.loadErr = fmt.Errorf(fmtstr, args...) image.loadErrMu.Unlock() + logger.Errorf("error loading binary %q: %v", image.Path, image.loadErr) } // LoadError returns any error incurred while loading this image. @@ -1161,14 +1162,14 @@ func (bi *BinaryInfo) funcToImage(fn *Function) *Image { // debug_frame is present it must be parsable correctly. func (bi *BinaryInfo) parseDebugFrameGeneral(image *Image, debugFrameBytes []byte, debugFrameName string, debugFrameErr error, ehFrameBytes []byte, ehFrameAddr uint64, ehFrameName string, byteOrder binary.ByteOrder) { if debugFrameBytes == nil && ehFrameBytes == nil { - image.setLoadError("could not get %s section: %v", debugFrameName, debugFrameErr) + image.setLoadError(bi.logger, "could not get %s section: %v", debugFrameName, debugFrameErr) return } if debugFrameBytes != nil { fe, err := frame.Parse(debugFrameBytes, byteOrder, image.StaticBase, bi.Arch.PtrSize(), 0) if err != nil { - image.setLoadError("could not parse %s section: %v", debugFrameName, err) + image.setLoadError(bi.logger, "could not parse %s section: %v", debugFrameName, err) return } bi.frameEntries = bi.frameEntries.Append(fe) @@ -1178,7 +1179,7 @@ func (bi *BinaryInfo) parseDebugFrameGeneral(image *Image, debugFrameBytes []byt fe, err := frame.Parse(ehFrameBytes, byteOrder, image.StaticBase, bi.Arch.PtrSize(), ehFrameAddr) if err != nil { if debugFrameBytes == nil { - image.setLoadError("could not parse %s section: %v", ehFrameName, err) + image.setLoadError(bi.logger, "could not parse %s section: %v", ehFrameName, err) return } bi.logger.Warnf("could not parse %s section: %v", ehFrameName, err) @@ -1431,7 +1432,7 @@ func (bi *BinaryInfo) setGStructOffsetElf(image *Image, exe *elf.File, wg *sync. switch exe.Machine { case elf.EM_X86_64, elf.EM_386: - tlsg := getSymbol(image, exe, "runtime.tlsg") + tlsg := getSymbol(image, bi.logger, exe, "runtime.tlsg") if tlsg == nil || tls == nil { bi.gStructOffset = ^uint64(bi.Arch.PtrSize()) + 1 //-ptrSize return @@ -1448,7 +1449,7 @@ func (bi *BinaryInfo) setGStructOffsetElf(image *Image, exe *elf.File, wg *sync. bi.gStructOffset = ^(memsz) + 1 + tlsg.Value // -tls.Memsz + tlsg.Value case elf.EM_AARCH64: - tlsg := getSymbol(image, exe, "runtime.tls_g") + tlsg := getSymbol(image, bi.logger, exe, "runtime.tls_g") if tlsg == nil || tls == nil { bi.gStructOffset = 2 * uint64(bi.Arch.PtrSize()) return @@ -1462,10 +1463,10 @@ func (bi *BinaryInfo) setGStructOffsetElf(image *Image, exe *elf.File, wg *sync. } } -func getSymbol(image *Image, exe *elf.File, name string) *elf.Symbol { +func getSymbol(image *Image, logger *logrus.Entry, exe *elf.File, name string) *elf.Symbol { symbols, err := exe.Symbols() if err != nil { - image.setLoadError("could not parse ELF symbols: %v", err) + image.setLoadError(logger, "could not parse ELF symbols: %v", err) return nil } @@ -1846,9 +1847,13 @@ func (bi *BinaryInfo) loadDebugInfoMaps(image *Image, debugInfoBytes, debugLineB reader := image.DwarfReader() - for entry, err := reader.Next(); entry != nil; entry, err = reader.Next() { + for { + entry, err := reader.Next() if err != nil { - image.setLoadError("error reading debug_info: %v", err) + image.setLoadError(bi.logger, "error reading debug_info: %v", err) + break + } + if entry == nil { break } switch entry.Tag { @@ -1986,11 +1991,15 @@ func (bi *BinaryInfo) loadDebugInfoMapsCompileUnit(ctxt *loadDebugInfoMapsContex depth := 0 - for entry, err := reader.Next(); entry != nil; entry, err = reader.Next() { + for { + entry, err := reader.Next() if err != nil { - image.setLoadError("error reading debug_info: %v", err) + image.setLoadError(bi.logger, "error reading debug_info: %v", err) return } + if entry == nil { + break + } switch entry.Tag { case 0: if depth == 0 { @@ -2197,7 +2206,7 @@ func (bi *BinaryInfo) loadDebugInfoMapsInlinedCalls(ctxt *loadDebugInfoMapsConte for { entry, err := reader.Next() if err != nil { - cu.image.setLoadError("error reading debug_info: %v", err) + cu.image.setLoadError(bi.logger, "error reading debug_info: %v", err) return } switch entry.Tag {