github.com/undoio/delve@v1.9.0/pkg/proc/core/windows_amd64_minidump.go (about)

     1  package core
     2  
     3  import (
     4  	"github.com/undoio/delve/pkg/logflags"
     5  	"github.com/undoio/delve/pkg/proc"
     6  	"github.com/undoio/delve/pkg/proc/core/minidump"
     7  	"github.com/undoio/delve/pkg/proc/winutil"
     8  )
     9  
    10  func readAMD64Minidump(minidumpPath, exePath string) (*process, proc.Thread, error) {
    11  	var logfn func(string, ...interface{})
    12  	if logflags.Minidump() {
    13  		logfn = logflags.MinidumpLogger().Infof
    14  	}
    15  
    16  	mdmp, err := minidump.Open(minidumpPath, logfn)
    17  	if err != nil {
    18  		if _, isNotAMinidump := err.(minidump.ErrNotAMinidump); isNotAMinidump {
    19  			return nil, nil, ErrUnrecognizedFormat
    20  		}
    21  		return nil, nil, err
    22  	}
    23  
    24  	memory := &splicedMemory{}
    25  
    26  	for i := range mdmp.MemoryRanges {
    27  		m := &mdmp.MemoryRanges[i]
    28  		memory.Add(m, m.Addr, uint64(len(m.Data)))
    29  	}
    30  
    31  	entryPoint := uint64(0)
    32  	if len(mdmp.Modules) > 0 {
    33  		entryPoint = mdmp.Modules[0].BaseOfImage
    34  	}
    35  
    36  	p := &process{
    37  		mem:         memory,
    38  		Threads:     map[int]*thread{},
    39  		bi:          proc.NewBinaryInfo("windows", "amd64"),
    40  		entryPoint:  entryPoint,
    41  		breakpoints: proc.NewBreakpointMap(),
    42  		pid:         int(mdmp.Pid),
    43  	}
    44  
    45  	for i := range mdmp.Threads {
    46  		th := &mdmp.Threads[i]
    47  		p.Threads[int(th.ID)] = &thread{&windowsAMD64Thread{th}, p, proc.CommonThread{}}
    48  	}
    49  	var currentThread proc.Thread
    50  	if len(mdmp.Threads) > 0 {
    51  		currentThread = p.Threads[int(mdmp.Threads[0].ID)]
    52  	}
    53  	return p, currentThread, nil
    54  }
    55  
    56  type windowsAMD64Thread struct {
    57  	th *minidump.Thread
    58  }
    59  
    60  func (th *windowsAMD64Thread) pid() int {
    61  	return int(th.th.ID)
    62  }
    63  
    64  func (th *windowsAMD64Thread) registers() (proc.Registers, error) {
    65  	return winutil.NewAMD64Registers(&th.th.Context, th.th.TEB), nil
    66  }