2018-10-16 10:48:59 +00:00
|
|
|
package core
|
|
|
|
|
|
|
|
import (
|
2019-01-04 18:39:25 +00:00
|
|
|
"github.com/go-delve/delve/pkg/logflags"
|
|
|
|
"github.com/go-delve/delve/pkg/proc"
|
|
|
|
"github.com/go-delve/delve/pkg/proc/core/minidump"
|
|
|
|
"github.com/go-delve/delve/pkg/proc/winutil"
|
2018-10-16 10:48:59 +00:00
|
|
|
)
|
|
|
|
|
2020-11-09 19:28:40 +00:00
|
|
|
func readAMD64Minidump(minidumpPath, exePath string) (*process, proc.Thread, error) {
|
2018-10-16 10:48:59 +00:00
|
|
|
var logfn func(string, ...interface{})
|
|
|
|
if logflags.Minidump() {
|
2019-03-27 21:58:36 +00:00
|
|
|
logfn = logflags.MinidumpLogger().Infof
|
2018-10-16 10:48:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
mdmp, err := minidump.Open(minidumpPath, logfn)
|
|
|
|
if err != nil {
|
|
|
|
if _, isNotAMinidump := err.(minidump.ErrNotAMinidump); isNotAMinidump {
|
2020-11-09 19:28:40 +00:00
|
|
|
return nil, nil, ErrUnrecognizedFormat
|
2018-10-16 10:48:59 +00:00
|
|
|
}
|
2020-11-09 19:28:40 +00:00
|
|
|
return nil, nil, err
|
2018-10-16 10:48:59 +00:00
|
|
|
}
|
|
|
|
|
2020-03-26 12:05:09 +00:00
|
|
|
memory := &splicedMemory{}
|
2018-10-16 10:48:59 +00:00
|
|
|
|
|
|
|
for i := range mdmp.MemoryRanges {
|
|
|
|
m := &mdmp.MemoryRanges[i]
|
2020-09-09 17:36:15 +00:00
|
|
|
memory.Add(m, m.Addr, uint64(len(m.Data)))
|
2018-10-16 10:48:59 +00:00
|
|
|
}
|
|
|
|
|
2020-07-28 16:19:51 +00:00
|
|
|
entryPoint := uint64(0)
|
|
|
|
if len(mdmp.Modules) > 0 {
|
|
|
|
entryPoint = mdmp.Modules[0].BaseOfImage
|
|
|
|
}
|
|
|
|
|
2020-03-26 12:05:09 +00:00
|
|
|
p := &process{
|
2018-10-16 10:48:59 +00:00
|
|
|
mem: memory,
|
2020-03-26 12:05:09 +00:00
|
|
|
Threads: map[int]*thread{},
|
2018-10-16 10:48:59 +00:00
|
|
|
bi: proc.NewBinaryInfo("windows", "amd64"),
|
2020-07-28 16:19:51 +00:00
|
|
|
entryPoint: entryPoint,
|
2018-10-16 10:48:59 +00:00
|
|
|
breakpoints: proc.NewBreakpointMap(),
|
|
|
|
pid: int(mdmp.Pid),
|
|
|
|
}
|
|
|
|
|
|
|
|
for i := range mdmp.Threads {
|
|
|
|
th := &mdmp.Threads[i]
|
2020-03-26 12:05:09 +00:00
|
|
|
p.Threads[int(th.ID)] = &thread{&windowsAMD64Thread{th}, p, proc.CommonThread{}}
|
2018-10-16 10:48:59 +00:00
|
|
|
}
|
2020-11-09 19:28:40 +00:00
|
|
|
var currentThread proc.Thread
|
|
|
|
if len(mdmp.Threads) > 0 {
|
|
|
|
currentThread = p.Threads[int(mdmp.Threads[0].ID)]
|
|
|
|
}
|
|
|
|
return p, currentThread, nil
|
2018-10-16 10:48:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type windowsAMD64Thread struct {
|
|
|
|
th *minidump.Thread
|
|
|
|
}
|
|
|
|
|
|
|
|
func (th *windowsAMD64Thread) pid() int {
|
|
|
|
return int(th.th.ID)
|
|
|
|
}
|
|
|
|
|
2020-05-13 18:56:50 +00:00
|
|
|
func (th *windowsAMD64Thread) registers() (proc.Registers, error) {
|
|
|
|
return winutil.NewAMD64Registers(&th.th.Context, th.th.TEB), nil
|
2018-10-16 10:48:59 +00:00
|
|
|
}
|