diff --git a/dwarf/op/op.go b/dwarf/op/op.go index 49c1ed205e7efd5d5de6babf750ee99b7be900cd..a53ea96fe4f04c71a16df6729b54a648e278089c 100644 --- a/dwarf/op/op.go +++ b/dwarf/op/op.go @@ -3,6 +3,7 @@ package op import ( "bytes" "encoding/binary" + "errors" "fmt" "github.com/derekparker/delve/dwarf/util" @@ -42,6 +43,10 @@ func ExecuteStackProgram(cfa int64, instructions []byte) (int64, error) { } } + if len(stack) == 0 { + return 0, errors.New("empty OP stack") + } + return stack[len(stack)-1], nil } diff --git a/proctl/proctl.go b/proctl/proctl.go index e53b15db42c927e6a95904a02b24edf88bb054d8..bb3fe176a0da74a2b9276d3f0cc4e8576089a4c5 100644 --- a/proctl/proctl.go +++ b/proctl/proctl.go @@ -304,6 +304,9 @@ func (dbp *DebuggedProcess) setChanRecvBreakpoints() (int, error) { if g.ChanRecvBlocked() { ret, err := g.chanRecvReturnAddr(dbp) if err != nil { + if _, ok := err.(NullAddrError); ok { + continue + } return 0, err } if _, err = dbp.TempBreak(ret); err != nil { diff --git a/proctl/stack.go b/proctl/stack.go index 6a58111cc143e63ec14dd5978e465a73b2bfda0f..16a2e5d2c12c82191744c2d1f726948dfdd57fc9 100644 --- a/proctl/stack.go +++ b/proctl/stack.go @@ -26,6 +26,12 @@ func (thread *ThreadContext) ReturnAddress() (uint64, error) { return locations[0].addr, nil } +type NullAddrError struct{} + +func (n NullAddrError) Error() string { + return "NULL address" +} + func (dbp *DebuggedProcess) stacktrace(pc, sp uint64, depth int) ([]stackLocation, error) { var ( ret = pc @@ -41,6 +47,9 @@ func (dbp *DebuggedProcess) stacktrace(pc, sp uint64, depth int) ([]stackLocatio } btoffset += fde.ReturnAddressOffset(ret) retaddr = uintptr(int64(sp) + btoffset + (i * 8)) + if retaddr == 0 { + return nil, NullAddrError{} + } _, err = readMemory(dbp.CurrentThread, retaddr, data) if err != nil { return nil, err