proc/native: support core dumping on FreeBSD (#3305)
Co-authored-by: a <a@kra>
This commit is contained in:
parent
83a2555497
commit
47481fe0ab
48
pkg/proc/native/dump_freebsd.go
Normal file
48
pkg/proc/native/dump_freebsd.go
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
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
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
//go:build (freebsd && amd64) || darwin || (windows && arm64)
|
//go:build darwin || (windows && arm64)
|
||||||
// +build freebsd,amd64 darwin windows,arm64
|
// +build darwin windows,arm64
|
||||||
|
|
||||||
package native
|
package native
|
||||||
|
|
||||||
|
@ -318,7 +318,7 @@ func (dbp *nativeProcess) initialize(path string, debugInfoDirs []string) (*proc
|
|||||||
DisableAsyncPreempt: runtime.GOOS == "windows" || (runtime.GOOS == "linux" && runtime.GOARCH == "arm64"),
|
DisableAsyncPreempt: runtime.GOOS == "windows" || (runtime.GOOS == "linux" && runtime.GOARCH == "arm64"),
|
||||||
|
|
||||||
StopReason: stopReason,
|
StopReason: stopReason,
|
||||||
CanDump: runtime.GOOS == "linux" || (runtime.GOOS == "windows" && runtime.GOARCH == "amd64"),
|
CanDump: runtime.GOOS == "linux" || runtime.GOOS == "freebsd" || (runtime.GOOS == "windows" && runtime.GOARCH == "amd64"),
|
||||||
})
|
})
|
||||||
procgrp.addTarget = addTarget
|
procgrp.addTarget = addTarget
|
||||||
tgt, err := procgrp.add(dbp, dbp.pid, dbp.memthread, path, stopReason)
|
tgt, err := procgrp.add(dbp, dbp.pid, dbp.memthread, path, stopReason)
|
||||||
|
@ -5163,7 +5163,7 @@ func TestIssue2319(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestDump(t *testing.T) {
|
func TestDump(t *testing.T) {
|
||||||
if runtime.GOOS == "freebsd" || (runtime.GOOS == "darwin" && testBackend == "native") || (runtime.GOOS == "windows" && runtime.GOARCH != "amd64") {
|
if (runtime.GOOS == "darwin" && testBackend == "native") || (runtime.GOOS == "windows" && runtime.GOARCH != "amd64") {
|
||||||
t.Skip("not supported")
|
t.Skip("not supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user