mirror of
				https://github.com/go-delve/delve.git
				synced 2025-10-31 18:57:18 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			84 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package proc
 | |
| 
 | |
| import "fmt"
 | |
| import "bytes"
 | |
| import sys "golang.org/x/sys/unix"
 | |
| 
 | |
| type Regs struct {
 | |
| 	regs *sys.PtraceRegs
 | |
| }
 | |
| 
 | |
| func (r *Regs) String() string {
 | |
| 	var buf bytes.Buffer
 | |
| 	var regs = []struct {
 | |
| 		k string
 | |
| 		v uint64
 | |
| 	}{
 | |
| 		{"Rip", r.regs.Rip},
 | |
| 		{"Rsp", r.regs.Rsp},
 | |
| 		{"Rax", r.regs.Rax},
 | |
| 		{"Rbx", r.regs.Rbx},
 | |
| 		{"Rcx", r.regs.Rcx},
 | |
| 		{"Rdx", r.regs.Rdx},
 | |
| 		{"Rdi", r.regs.Rdi},
 | |
| 		{"Rsi", r.regs.Rsi},
 | |
| 		{"Rbp", r.regs.Rbp},
 | |
| 		{"R8", r.regs.R8},
 | |
| 		{"R9", r.regs.R9},
 | |
| 		{"R10", r.regs.R10},
 | |
| 		{"R11", r.regs.R11},
 | |
| 		{"R12", r.regs.R12},
 | |
| 		{"R13", r.regs.R13},
 | |
| 		{"R14", r.regs.R14},
 | |
| 		{"R15", r.regs.R15},
 | |
| 		{"Orig_rax", r.regs.Orig_rax},
 | |
| 		{"Cs", r.regs.Cs},
 | |
| 		{"Eflags", r.regs.Eflags},
 | |
| 		{"Ss", r.regs.Ss},
 | |
| 		{"Fs_base", r.regs.Fs_base},
 | |
| 		{"Gs_base", r.regs.Gs_base},
 | |
| 		{"Ds", r.regs.Ds},
 | |
| 		{"Es", r.regs.Es},
 | |
| 		{"Fs", r.regs.Fs},
 | |
| 		{"Gs", r.regs.Gs},
 | |
| 	}
 | |
| 	for _, reg := range regs {
 | |
| 		fmt.Fprintf(&buf, "%s = 0x%x\n", reg.k, reg.v)
 | |
| 	}
 | |
| 	return buf.String()
 | |
| }
 | |
| 
 | |
| func (r *Regs) PC() uint64 {
 | |
| 	return r.regs.PC()
 | |
| }
 | |
| 
 | |
| func (r *Regs) SP() uint64 {
 | |
| 	return r.regs.Rsp
 | |
| }
 | |
| 
 | |
| func (r *Regs) CX() uint64 {
 | |
| 	return r.regs.Rcx
 | |
| }
 | |
| 
 | |
| func (r *Regs) TLS() uint64 {
 | |
| 	return r.regs.Fs_base
 | |
| }
 | |
| 
 | |
| func (r *Regs) SetPC(thread *Thread, pc uint64) (err error) {
 | |
| 	r.regs.SetPC(pc)
 | |
| 	thread.dbp.execPtraceFunc(func() { err = sys.PtraceSetRegs(thread.Id, r.regs) })
 | |
| 	return
 | |
| }
 | |
| 
 | |
| func registers(thread *Thread) (Registers, error) {
 | |
| 	var (
 | |
| 		regs sys.PtraceRegs
 | |
| 		err  error
 | |
| 	)
 | |
| 	thread.dbp.execPtraceFunc(func() { err = sys.PtraceGetRegs(thread.Id, ®s) })
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	return &Regs{®s}, nil
 | |
| }
 | 
