diff --git a/internal/dwarf/frame/table.go b/internal/dwarf/frame/table.go index 4c5156d40a..8bcd4749ca 100644 --- a/internal/dwarf/frame/table.go +++ b/internal/dwarf/frame/table.go @@ -321,7 +321,7 @@ func executeDWARFInstruction(ctx *Context) error { fn, err := lookupFunc(instruction, ctx) if err != nil { - return fmt.Errorf(" DWARF CFA rule is not valid. This should never happen :%w", err) + return fmt.Errorf("DWARF CFA rule is not valid. This should never happen :%w", err) } fn(ctx) diff --git a/pkg/stack/unwind/compact_unwind_table.go b/pkg/stack/unwind/compact_unwind_table.go index a2c5c4a5a9..e052b2a194 100644 --- a/pkg/stack/unwind/compact_unwind_table.go +++ b/pkg/stack/unwind/compact_unwind_table.go @@ -158,14 +158,14 @@ func BuildCompactUnwindTable(fdes frame.FrameDescriptionEntries, arch elf.Machin return CompactUnwindTable{}, err } - var err2 error - - for insCtx, err1 := frameContext.Next(); frameContext.HasNext(); insCtx, err2 = frameContext.Next() { - if err1 != nil { - return CompactUnwindTable{}, err1 + for { + insCtx, err := frameContext.Next() + if err != nil { + return CompactUnwindTable{}, err } - if err2 != nil { - return CompactUnwindTable{}, err2 + + if !frameContext.HasNext() { + break } row := unwindTableRow(insCtx) @@ -175,7 +175,6 @@ func BuildCompactUnwindTable(fdes frame.FrameDescriptionEntries, arch elf.Machin } table = append(table, compactRow) } - lastFunctionPc = fde.End() } // Add a synthetic row at the end of the unwind table. It is fine diff --git a/pkg/stack/unwind/unwind_table.go b/pkg/stack/unwind/unwind_table.go index b9fa10a586..194458ce29 100644 --- a/pkg/stack/unwind/unwind_table.go +++ b/pkg/stack/unwind/unwind_table.go @@ -106,14 +106,16 @@ func (ptb *UnwindTableBuilder) PrintTable(writer io.Writer, path string, compact if err != nil { return err } - var err2 error - for insCtx, err1 := frameContext.Next(); frameContext.HasNext(); insCtx, err2 = frameContext.Next() { - if err1 != nil { - return err1 + + for { + insCtx, err := frameContext.Next() + if err != nil { + return err } - if err2 != nil { - return err2 + if !frameContext.HasNext() { + break } + unwindRow := unwindTableRow(insCtx) if unwindRow == nil { @@ -241,13 +243,15 @@ func BuildUnwindTable(fdes frame.FrameDescriptionEntries) (UnwindTable, error) { if err != nil { return UnwindTable{}, err } - var err2 error - for insCtx, err1 := frameContext.Next(); frameContext.HasNext(); insCtx, err2 = frameContext.Next() { - if err1 != nil { - return UnwindTable{}, err1 + + for { + insCtx, err := frameContext.Next() + if err != nil { + return UnwindTable{}, err } - if err2 != nil { - return UnwindTable{}, err2 + + if !frameContext.HasNext() { + break } table = append(table, *unwindTableRow(insCtx)) } diff --git a/pkg/stack/unwind/unwind_table_test.go b/pkg/stack/unwind/unwind_table_test.go index a05ffe67f1..8809da4742 100644 --- a/pkg/stack/unwind/unwind_table_test.go +++ b/pkg/stack/unwind/unwind_table_test.go @@ -15,7 +15,6 @@ package unwind import ( - "fmt" "testing" "github.com/stretchr/testify/require" @@ -81,16 +80,19 @@ func benchmarkParsingDWARFUnwindInformation(b *testing.B, executable string) { for _, fde := range fdes { frameContext, err := frame.ExecuteDWARFProgram(fde, unwindContext) if err != nil { - panic(fmt.Sprintf("unable to evaluate DWARF unwind code. Error: %s", err)) + b.Fail() } - var err2 error - for insCtx, err1 := frameContext.Next(); frameContext.HasNext(); insCtx, err2 = frameContext.Next() { - if err1 != nil { - panic(fmt.Sprintf("unable to evaluate DWARF unwind code. Error: %s", err1)) + + for { + insCtx, err := frameContext.Next() + if err != nil { + b.Fail() } - if err2 != nil { - panic(fmt.Sprintf("unable to evaluate DWARF unwind code. Error: %s", err2)) + + if !frameContext.HasNext() { + break } + unwindRow := unwindTableRow(insCtx) if unwindRow.RBP.Rule == frame.RuleUndefined || unwindRow.RBP.Offset == 0 { // u