mirror of
				https://github.com/go-delve/delve.git
				synced 2025-11-01 03:42:59 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package native
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 
 | |
| 	"github.com/go-delve/delve/pkg/proc"
 | |
| 	"github.com/go-delve/delve/pkg/proc/amd64util"
 | |
| 	"github.com/go-delve/delve/pkg/proc/winutil"
 | |
| )
 | |
| 
 | |
| func newContext() *winutil.AMD64CONTEXT {
 | |
| 	return winutil.NewAMD64CONTEXT()
 | |
| }
 | |
| 
 | |
| func newRegisters(context *winutil.AMD64CONTEXT, TebBaseAddress uint64) *winutil.AMD64Registers {
 | |
| 	return winutil.NewAMD64Registers(context, TebBaseAddress)
 | |
| }
 | |
| 
 | |
| func (t *nativeThread) setContext(context *winutil.AMD64CONTEXT) error {
 | |
| 	return _SetThreadContext(t.os.hThread, context)
 | |
| }
 | |
| 
 | |
| func (t *nativeThread) getContext(context *winutil.AMD64CONTEXT) error {
 | |
| 	return _GetThreadContext(t.os.hThread, context)
 | |
| }
 | |
| 
 | |
| func (t *nativeThread) restoreRegisters(savedRegs proc.Registers) error {
 | |
| 	return t.setContext(savedRegs.(*winutil.AMD64Registers).Context)
 | |
| }
 | |
| 
 | |
| func (t *nativeThread) withDebugRegisters(f func(*amd64util.DebugRegisters) error) error {
 | |
| 	if !enableHardwareBreakpoints {
 | |
| 		return errors.New("hardware breakpoints not supported")
 | |
| 	}
 | |
| 
 | |
| 	context := winutil.NewAMD64CONTEXT()
 | |
| 	context.ContextFlags = _CONTEXT_DEBUG_REGISTERS
 | |
| 
 | |
| 	err := t.getContext(context)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	drs := amd64util.NewDebugRegisters(&context.Dr0, &context.Dr1, &context.Dr2, &context.Dr3, &context.Dr6, &context.Dr7)
 | |
| 
 | |
| 	err = f(drs)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	if drs.Dirty {
 | |
| 		return t.setContext(context)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | 
