From 439ee0a973f2ad9b8083f23767ca77c2ffea718e Mon Sep 17 00:00:00 2001 From: Lantao Liu Date: Fri, 27 Oct 2017 21:26:26 +0000 Subject: [PATCH] Add stack dump. Signed-off-by: Lantao Liu --- cmd/cri-containerd/cri_containerd.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/cmd/cri-containerd/cri_containerd.go b/cmd/cri-containerd/cri_containerd.go index f1fad8e9d..8ffed0f9a 100644 --- a/cmd/cri-containerd/cri_containerd.go +++ b/cmd/cri-containerd/cri_containerd.go @@ -20,7 +20,10 @@ import ( "flag" "fmt" "os" + "os/signal" "path/filepath" + "runtime" + "syscall" "github.com/docker/docker/pkg/reexec" "github.com/golang/glog" @@ -118,6 +121,7 @@ func main() { cmd.AddCommand(loadImageCommand()) cmd.RunE = func(cmd *cobra.Command, args []string) error { + setupDumpStacksTrap() if err := o.InitFlags(cmd.Flags()); err != nil { return fmt.Errorf("failed to init CRI containerd flags: %v", err) } @@ -155,3 +159,26 @@ func validateConfig(o *options.CRIContainerdOptions) { selinux.SetDisabled() } } + +func setupDumpStacksTrap() { + c := make(chan os.Signal, 1) + signal.Notify(c, syscall.SIGUSR1) + go func() { + for range c { + dumpStacks() + } + }() +} + +func dumpStacks() { + buf := make([]byte, 1024) + for { + n := runtime.Stack(buf, true) + if n < len(buf) { + buf = buf[:n] + break + } + buf = make([]byte, 2*len(buf)) + } + glog.V(0).Infof("=== BEGIN goroutine stack dump ===\n%s\n=== END goroutine stack dump ===", buf) +}