So sichern Sie Goroutine-Stacks, ohne einen Go-Prozess zu beenden
Ein Go-Prozess erfordert die Fähigkeit, Stack-Traces für jede Goroutine zu sichern, ohne sie zu ändern Quellcode entfernen oder beenden. Um dies zu erreichen, sollten Sie die Implementierung eines Signalhandlers mit dem folgenden Codeausschnitt in Betracht ziehen:
import ( "fmt" "os" "os/signal" "runtime" "syscall" ) func main() { sigChan := make(chan os.Signal) go func() { stacktrace := make([]byte, 8192) for _ = range sigChan { length := runtime.Stack(stacktrace, true) fmt.Println(string(stacktrace[:length])) } }() signal.Notify(sigChan, syscall.SIGQUIT) ... }
Wenn ein SIGQUIT-Signal empfangen wird, wird es an den angegebenen Kanal weitergeleitet. Anschließend formatiert die runtime.Stack-Funktion den Stack-Trace in einen angegebenen Puffer. Wenn der Stack-Trace die Puffergröße überschreitet, wird er abgeschnitten und gedruckt. Dadurch ermöglicht dieser Ansatz die Erfassung eines Stack-Trace für jede Goroutine, ohne den laufenden Go-Prozess zu unterbrechen.
Das obige ist der detaillierte Inhalt vonWie entleere ich Goroutine-Stacks in einem Go-Prozess, ohne ihn zu beenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!