github.com/docker/engine@v22.0.0-20211208180946-d456264580cf+incompatible/daemon/debugtrap_windows.go (about) 1 package daemon // import "github.com/docker/docker/daemon" 2 3 import ( 4 "fmt" 5 "os" 6 "unsafe" 7 8 "github.com/docker/docker/pkg/stack" 9 "github.com/sirupsen/logrus" 10 "golang.org/x/sys/windows" 11 ) 12 13 func (daemon *Daemon) setupDumpStackTrap(root string) { 14 // Windows does not support signals like *nix systems. So instead of 15 // trapping on SIGUSR1 to dump stacks, we wait on a Win32 event to be 16 // signaled. ACL'd to builtin administrators and local system 17 event := "Global\\stackdump-" + fmt.Sprint(os.Getpid()) 18 ev, _ := windows.UTF16PtrFromString(event) 19 sd, err := windows.SecurityDescriptorFromString("D:P(A;;GA;;;BA)(A;;GA;;;SY)") 20 if err != nil { 21 logrus.Errorf("failed to get security descriptor for debug stackdump event %s: %s", event, err.Error()) 22 return 23 } 24 var sa windows.SecurityAttributes 25 sa.Length = uint32(unsafe.Sizeof(sa)) 26 sa.InheritHandle = 1 27 sa.SecurityDescriptor = sd 28 h, err := windows.CreateEvent(&sa, 0, 0, ev) 29 if h == 0 || err != nil { 30 logrus.Errorf("failed to create debug stackdump event %s: %s", event, err.Error()) 31 return 32 } 33 go func() { 34 logrus.Debugf("Stackdump - waiting signal at %s", event) 35 for { 36 windows.WaitForSingleObject(h, windows.INFINITE) 37 path, err := stack.DumpToFile(root) 38 if err != nil { 39 logrus.WithError(err).Error("failed to write goroutines dump") 40 } else { 41 logrus.Infof("goroutine stacks written to %s", path) 42 } 43 } 44 }() 45 }