mirror of
https://github.com/go-delve/delve.git
synced 2025-11-03 13:57:33 +08:00
Handle NULL addrs / empty OP stacks
This commit is contained in:
@ -3,6 +3,7 @@ package op
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/derekparker/delve/dwarf/util"
|
"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
|
return stack[len(stack)-1], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -304,6 +304,9 @@ func (dbp *DebuggedProcess) setChanRecvBreakpoints() (int, error) {
|
|||||||
if g.ChanRecvBlocked() {
|
if g.ChanRecvBlocked() {
|
||||||
ret, err := g.chanRecvReturnAddr(dbp)
|
ret, err := g.chanRecvReturnAddr(dbp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if _, ok := err.(NullAddrError); ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
if _, err = dbp.TempBreak(ret); err != nil {
|
if _, err = dbp.TempBreak(ret); err != nil {
|
||||||
|
|||||||
@ -26,6 +26,12 @@ func (thread *ThreadContext) ReturnAddress() (uint64, error) {
|
|||||||
return locations[0].addr, nil
|
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) {
|
func (dbp *DebuggedProcess) stacktrace(pc, sp uint64, depth int) ([]stackLocation, error) {
|
||||||
var (
|
var (
|
||||||
ret = pc
|
ret = pc
|
||||||
@ -41,6 +47,9 @@ func (dbp *DebuggedProcess) stacktrace(pc, sp uint64, depth int) ([]stackLocatio
|
|||||||
}
|
}
|
||||||
btoffset += fde.ReturnAddressOffset(ret)
|
btoffset += fde.ReturnAddressOffset(ret)
|
||||||
retaddr = uintptr(int64(sp) + btoffset + (i * 8))
|
retaddr = uintptr(int64(sp) + btoffset + (i * 8))
|
||||||
|
if retaddr == 0 {
|
||||||
|
return nil, NullAddrError{}
|
||||||
|
}
|
||||||
_, err = readMemory(dbp.CurrentThread, retaddr, data)
|
_, err = readMemory(dbp.CurrentThread, retaddr, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
Reference in New Issue
Block a user