fix(debug): hardware watchpoints, signal stops and breakpoint restore
Assisted-by: GLM 5.3
This commit is contained in:
@@ -73,9 +73,29 @@ func decodeRflags(f uint64) string {
|
||||
return flags[:len(flags)-1]
|
||||
}
|
||||
|
||||
// archReturnAddr reads the return address from the stack (amd64 ABI0 convention).
|
||||
// archReturnAddr reads the return address of the current frame (amd64
|
||||
// ABI0 convention). A function that contains a CALL (or has a frame) is
|
||||
// assembled with the prologue PUSHQ BP; MOVQ SP, BP, so mid-function the
|
||||
// word at SP is the saved caller BP, a stack address, and the return
|
||||
// address sits further up. Walk the stack from SP and take the first word
|
||||
// that lies in an executable mapping: stack and data words never do, a
|
||||
// return address always does.
|
||||
func archReturnAddr(s *Session, regs *Regs) (uint64, error) {
|
||||
return s.Peek(regs.GetSP())
|
||||
ranges := execRanges(s.pid)
|
||||
for off := uint64(0); off < 512; off += 8 {
|
||||
word, err := s.Peek(regs.RSP + off)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
for _, r := range ranges {
|
||||
if word >= r.lo && word < r.hi {
|
||||
return word, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
// No mapping available or nothing code-like on the stack: fall back to
|
||||
// the raw entry convention, [SP] before any push.
|
||||
return s.Peek(regs.RSP)
|
||||
}
|
||||
|
||||
// archSPLabel returns the SP register name for display.
|
||||
|
||||
Reference in New Issue
Block a user