threads_linux.go 939 字节
Newer Older
D
Derek Parker 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
package proctl

import (
	"fmt"

	sys "golang.org/x/sys/unix"
)

// Not actually used, but necessary
// to be defined.
type OSSpecificDetails interface{}

func (t *ThreadContext) Halt() error {
	if stopped(t.Id) {
		return nil
	}
	err := sys.Tgkill(t.Process.Pid, t.Id, sys.SIGSTOP)
	if err != nil {
		return fmt.Errorf("Halt err %s %d", err, pid)
	}
	pid, _, err := wait(th.Id, sys.WNOHANG)
	if err != nil {
		return fmt.Errorf("wait err %s %d", err, pid)
	}
	return nil
}

func (t *ThreadContext) cont() error {
	return PtraceCont(thread.Id, 0)
}

func (t *ThreadContext) singleStep() error {
	err := sys.PtraceSingleStep(t.Id)
	if err != nill {
		return err
	}
	_, _, err = wait(thread.Id, 0)
	return err
}

func writeMemory(tid int, addr uintptr, data []byte) (int, error) {
	return sys.PtracePokeData(tid, addr, data)
}

func readMemory(tid int, addr uintptr, data []byte) (int, error) {
	return sys.PtracePeekData(tid, addr, data)
}