summaryrefslogtreecommitdiff
path: root/src/runtime/export_debug_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/export_debug_test.go')
-rw-r--r--src/runtime/export_debug_test.go12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/runtime/export_debug_test.go b/src/runtime/export_debug_test.go
index 97bb7bd62a..ed4242ef24 100644
--- a/src/runtime/export_debug_test.go
+++ b/src/runtime/export_debug_test.go
@@ -48,6 +48,9 @@ func InjectDebugCall(gp *g, fn, args interface{}, tkill func(tid int) error, ret
h := new(debugCallHandler)
h.gp = gp
+ // gp may not be running right now, but we can still get the M
+ // it will run on since it's locked.
+ h.mp = gp.lockedm.ptr()
h.fv, h.argp, h.argSize = fv, argp, argSize
h.handleF = h.handle // Avoid allocating closure during signal
@@ -86,6 +89,7 @@ func InjectDebugCall(gp *g, fn, args interface{}, tkill func(tid int) error, ret
type debugCallHandler struct {
gp *g
+ mp *m
fv *funcval
argp unsafe.Pointer
argSize uintptr
@@ -102,8 +106,8 @@ type debugCallHandler struct {
func (h *debugCallHandler) inject(info *siginfo, ctxt *sigctxt, gp2 *g) bool {
switch h.gp.atomicstatus {
case _Grunning:
- if getg().m != h.gp.m {
- println("trap on wrong M", getg().m, h.gp.m)
+ if getg().m != h.mp {
+ println("trap on wrong M", getg().m, h.mp)
return false
}
// Push current PC on the stack.
@@ -135,8 +139,8 @@ func (h *debugCallHandler) inject(info *siginfo, ctxt *sigctxt, gp2 *g) bool {
func (h *debugCallHandler) handle(info *siginfo, ctxt *sigctxt, gp2 *g) bool {
// Sanity check.
- if getg().m != h.gp.m {
- println("trap on wrong M", getg().m, h.gp.m)
+ if getg().m != h.mp {
+ println("trap on wrong M", getg().m, h.mp)
return false
}
f := findfunc(uintptr(ctxt.rip()))