mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
gvisor/ptrace: print guest registers if a stub stopped with unexpected code
PiperOrigin-RevId: 252855280
This commit is contained in:
@@ -21,6 +21,7 @@ import (
|
||||
"sync"
|
||||
"syscall"
|
||||
|
||||
"gvisor.googlesource.com/gvisor/pkg/log"
|
||||
"gvisor.googlesource.com/gvisor/pkg/procid"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/arch"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/platform"
|
||||
@@ -300,6 +301,18 @@ const (
|
||||
killed
|
||||
)
|
||||
|
||||
func (t *thread) dumpAndPanic(message string) {
|
||||
var regs syscall.PtraceRegs
|
||||
message += "\n"
|
||||
if err := t.getRegs(®s); err == nil {
|
||||
message += dumpRegs(®s)
|
||||
} else {
|
||||
log.Warningf("unable to get registers: %v", err)
|
||||
}
|
||||
message += fmt.Sprintf("stubStart\t = %016x\n", stubStart)
|
||||
panic(message)
|
||||
}
|
||||
|
||||
// wait waits for a stop event.
|
||||
//
|
||||
// Precondition: outcome is a valid waitOutcome.
|
||||
@@ -320,7 +333,7 @@ func (t *thread) wait(outcome waitOutcome) syscall.Signal {
|
||||
switch outcome {
|
||||
case stopped:
|
||||
if !status.Stopped() {
|
||||
panic(fmt.Sprintf("ptrace status unexpected: got %v, wanted stopped", status))
|
||||
t.dumpAndPanic(fmt.Sprintf("ptrace status unexpected: got %v, wanted stopped", status))
|
||||
}
|
||||
stopSig := status.StopSignal()
|
||||
if stopSig == 0 {
|
||||
@@ -334,12 +347,12 @@ func (t *thread) wait(outcome waitOutcome) syscall.Signal {
|
||||
return stopSig
|
||||
case killed:
|
||||
if !status.Exited() && !status.Signaled() {
|
||||
panic(fmt.Sprintf("ptrace status unexpected: got %v, wanted exited", status))
|
||||
t.dumpAndPanic(fmt.Sprintf("ptrace status unexpected: got %v, wanted exited", status))
|
||||
}
|
||||
return syscall.Signal(status.ExitStatus())
|
||||
default:
|
||||
// Should not happen.
|
||||
panic(fmt.Sprintf("unknown outcome: %v", outcome))
|
||||
t.dumpAndPanic(fmt.Sprintf("unknown outcome: %v", outcome))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
package ptrace
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"syscall"
|
||||
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/arch"
|
||||
@@ -102,3 +104,38 @@ func syscallReturnValue(regs *syscall.PtraceRegs) (uintptr, error) {
|
||||
}
|
||||
return uintptr(rval), nil
|
||||
}
|
||||
|
||||
func dumpRegs(regs *syscall.PtraceRegs) string {
|
||||
var m strings.Builder
|
||||
|
||||
fmt.Fprintf(&m, "Registers:\n")
|
||||
fmt.Fprintf(&m, "\tR15\t = %016x\n", regs.R15)
|
||||
fmt.Fprintf(&m, "\tR14\t = %016x\n", regs.R14)
|
||||
fmt.Fprintf(&m, "\tR13\t = %016x\n", regs.R13)
|
||||
fmt.Fprintf(&m, "\tR12\t = %016x\n", regs.R12)
|
||||
fmt.Fprintf(&m, "\tRbp\t = %016x\n", regs.Rbp)
|
||||
fmt.Fprintf(&m, "\tRbx\t = %016x\n", regs.Rbx)
|
||||
fmt.Fprintf(&m, "\tR11\t = %016x\n", regs.R11)
|
||||
fmt.Fprintf(&m, "\tR10\t = %016x\n", regs.R10)
|
||||
fmt.Fprintf(&m, "\tR9\t = %016x\n", regs.R9)
|
||||
fmt.Fprintf(&m, "\tR8\t = %016x\n", regs.R8)
|
||||
fmt.Fprintf(&m, "\tRax\t = %016x\n", regs.Rax)
|
||||
fmt.Fprintf(&m, "\tRcx\t = %016x\n", regs.Rcx)
|
||||
fmt.Fprintf(&m, "\tRdx\t = %016x\n", regs.Rdx)
|
||||
fmt.Fprintf(&m, "\tRsi\t = %016x\n", regs.Rsi)
|
||||
fmt.Fprintf(&m, "\tRdi\t = %016x\n", regs.Rdi)
|
||||
fmt.Fprintf(&m, "\tOrig_rax = %016x\n", regs.Orig_rax)
|
||||
fmt.Fprintf(&m, "\tRip\t = %016x\n", regs.Rip)
|
||||
fmt.Fprintf(&m, "\tCs\t = %016x\n", regs.Cs)
|
||||
fmt.Fprintf(&m, "\tEflags\t = %016x\n", regs.Eflags)
|
||||
fmt.Fprintf(&m, "\tRsp\t = %016x\n", regs.Rsp)
|
||||
fmt.Fprintf(&m, "\tSs\t = %016x\n", regs.Ss)
|
||||
fmt.Fprintf(&m, "\tFs_base\t = %016x\n", regs.Fs_base)
|
||||
fmt.Fprintf(&m, "\tGs_base\t = %016x\n", regs.Gs_base)
|
||||
fmt.Fprintf(&m, "\tDs\t = %016x\n", regs.Ds)
|
||||
fmt.Fprintf(&m, "\tEs\t = %016x\n", regs.Es)
|
||||
fmt.Fprintf(&m, "\tFs\t = %016x\n", regs.Fs)
|
||||
fmt.Fprintf(&m, "\tGs\t = %016x\n", regs.Gs)
|
||||
|
||||
return m.String()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user