mirror of https://github.com/beego/bee.git
60 lines
1.4 KiB
Go
60 lines
1.4 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, 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, ErrUnrecognizedFormat
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
memory := &SplicedMemory{}
|
|
|
|
for i := range mdmp.MemoryRanges {
|
|
m := &mdmp.MemoryRanges[i]
|
|
memory.Add(m, uintptr(m.Addr), uintptr(len(m.Data)))
|
|
}
|
|
|
|
p := &Process{
|
|
mem: memory,
|
|
Threads: map[int]*Thread{},
|
|
bi: proc.NewBinaryInfo("windows", "amd64"),
|
|
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{}}
|
|
if p.currentThread == nil {
|
|
p.currentThread = p.Threads[int(th.ID)]
|
|
}
|
|
}
|
|
return p, nil
|
|
}
|
|
|
|
type windowsAMD64Thread struct {
|
|
th *minidump.Thread
|
|
}
|
|
|
|
func (th *windowsAMD64Thread) pid() int {
|
|
return int(th.th.ID)
|
|
}
|
|
|
|
func (th *windowsAMD64Thread) registers(floatingPoint bool) (proc.Registers, error) {
|
|
return winutil.NewAMD64Registers(&th.th.Context, th.th.TEB, floatingPoint), nil
|
|
}
|