github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+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/signal"
     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 := signal.DumpStacks(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  }