delve/pkg/proc/native/dump_freebsd.go
Alessandro Arzilli 47481fe0ab
proc/native: support core dumping on FreeBSD (#3305)
Co-authored-by: a <a@kra>
2023-04-24 14:33:38 -07:00

49 lines
1.3 KiB
Go

package native
import (
"errors"
"unsafe"
"github.com/go-delve/delve/pkg/elfwriter"
"github.com/go-delve/delve/pkg/proc"
)
/*
#include <sys/types.h>
#include <sys/user.h>
#include <libutil.h>
#include <stdlib.h>
*/
import "C"
func (p *nativeProcess) MemoryMap() ([]proc.MemoryMapEntry, error) {
var cnt C.int
vmentries := C.kinfo_getvmmap(C.int(p.pid), &cnt)
if vmentries == nil {
return nil, errors.New("kinfo_getvmmap call failed")
}
defer C.free(unsafe.Pointer(vmentries))
r := make([]proc.MemoryMapEntry, 0, int(cnt))
base := uintptr(unsafe.Pointer(vmentries))
sz := unsafe.Sizeof(C.struct_kinfo_vmentry{})
for i := 0; i < int(cnt); i++ {
vmentry := (*C.struct_kinfo_vmentry)(unsafe.Pointer(base + sz*uintptr(i)))
switch vmentry.kve_type {
case C.KVME_TYPE_DEFAULT, C.KVME_TYPE_VNODE, C.KVME_TYPE_SWAP, C.KVME_TYPE_PHYS:
r = append(r, proc.MemoryMapEntry{
Addr: uint64(vmentry.kve_start),
Size: uint64(vmentry.kve_end - vmentry.kve_start),
Read: vmentry.kve_protection&C.KVME_PROT_READ != 0,
Write: vmentry.kve_protection&C.KVME_PROT_WRITE != 0,
Exec: vmentry.kve_protection&C.KVME_PROT_EXEC != 0,
})
}
}
return r, nil
}
func (p *nativeProcess) DumpProcessNotes(notes []elfwriter.Note, threadDone func()) (threadsDone bool, notesout []elfwriter.Note, err error) {
return false, notes, nil
}