
Add code to fuzz the expression evaluator and variable loader, see comment to FuzzEvalExpression for how to use this.
67 lines
1.6 KiB
Go
67 lines
1.6 KiB
Go
package core
|
|
|
|
import (
|
|
"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"
|
|
)
|
|
|
|
func readAMD64Minidump(minidumpPath, exePath string) (*process, proc.Thread, error) {
|
|
var logfn func(string, ...interface{})
|
|
if logflags.Minidump() {
|
|
logfn = logflags.MinidumpLogger().Infof
|
|
}
|
|
|
|
mdmp, err := minidump.Open(minidumpPath, logfn)
|
|
if err != nil {
|
|
if _, isNotAMinidump := err.(minidump.ErrNotAMinidump); isNotAMinidump {
|
|
return nil, nil, ErrUnrecognizedFormat
|
|
}
|
|
return nil, nil, err
|
|
}
|
|
|
|
memory := &SplicedMemory{}
|
|
|
|
for i := range mdmp.MemoryRanges {
|
|
m := &mdmp.MemoryRanges[i]
|
|
memory.Add(m, m.Addr, uint64(len(m.Data)))
|
|
}
|
|
|
|
entryPoint := uint64(0)
|
|
if len(mdmp.Modules) > 0 {
|
|
entryPoint = mdmp.Modules[0].BaseOfImage
|
|
}
|
|
|
|
p := &process{
|
|
mem: memory,
|
|
Threads: map[int]*thread{},
|
|
bi: proc.NewBinaryInfo("windows", "amd64"),
|
|
entryPoint: entryPoint,
|
|
breakpoints: proc.NewBreakpointMap(),
|
|
pid: int(mdmp.Pid),
|
|
}
|
|
|
|
for i := range mdmp.Threads {
|
|
th := &mdmp.Threads[i]
|
|
p.Threads[int(th.ID)] = &thread{&windowsAMD64Thread{th}, p, proc.CommonThread{}}
|
|
}
|
|
var currentThread proc.Thread
|
|
if len(mdmp.Threads) > 0 {
|
|
currentThread = p.Threads[int(mdmp.Threads[0].ID)]
|
|
}
|
|
return p, currentThread, nil
|
|
}
|
|
|
|
type windowsAMD64Thread struct {
|
|
th *minidump.Thread
|
|
}
|
|
|
|
func (th *windowsAMD64Thread) pid() int {
|
|
return int(th.th.ID)
|
|
}
|
|
|
|
func (th *windowsAMD64Thread) registers() (proc.Registers, error) {
|
|
return winutil.NewAMD64Registers(&th.th.Context, th.th.TEB), nil
|
|
}
|