delve/proctl/proctl_linux_amd64.go

73 lines
1.2 KiB
Go
Raw Normal View History

2014-05-20 18:23:35 +00:00
package proctl
import (
"fmt"
"os"
"syscall"
)
type DebuggedProcess struct {
2014-05-20 18:23:36 +00:00
Pid int
Regs *syscall.PtraceRegs
Process *os.Process
ProcessState *os.ProcessState
2014-05-20 18:23:35 +00:00
}
func NewDebugProcess(pid int) (*DebuggedProcess, error) {
err := syscall.PtraceAttach(pid)
if err != nil {
return nil, err
}
proc, err := os.FindProcess(pid)
if err != nil {
return nil, err
}
2014-05-20 18:23:36 +00:00
ps, err := proc.Wait()
2014-05-20 18:23:35 +00:00
if err != nil {
return nil, err
}
2014-05-20 18:23:36 +00:00
debuggedProc := DebuggedProcess{
Pid: pid,
Regs: &syscall.PtraceRegs{},
Process: proc,
ProcessState: ps,
}
2014-05-20 18:23:35 +00:00
return &debuggedProc, nil
}
func (dbp *DebuggedProcess) Registers() (*syscall.PtraceRegs, error) {
err := syscall.PtraceGetRegs(dbp.Pid, dbp.Regs)
if err != nil {
return nil, fmt.Errorf("Registers():", err)
}
return dbp.Regs, nil
}
func (dbp *DebuggedProcess) Step() error {
2014-05-20 21:39:32 +00:00
return dbp.HandleResult(syscall.PtraceSingleStep(dbp.Pid))
2014-05-20 18:23:35 +00:00
}
2014-05-20 18:23:36 +00:00
func (dbp *DebuggedProcess) Continue() error {
2014-05-20 21:39:32 +00:00
return dbp.HandleResult(syscall.PtraceCont(dbp.Pid, 0))
2014-05-20 20:15:52 +00:00
}
2014-05-20 21:39:32 +00:00
func (dbp *DebuggedProcess) HandleResult(err error) error {
2014-05-20 18:23:36 +00:00
if err != nil {
return err
}
ps, err := dbp.Process.Wait()
if err != nil {
return err
}
dbp.ProcessState = ps
return nil
}