提交 5a408e70 编写于 作者: D Derek Parker

Handle NULL addrs / empty OP stacks

上级 df78a294
......@@ -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
}
......
......@@ -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 {
......
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册