Go 프로세스를 중단하지 않고 고루틴 스택을 덤프하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-29 18:36:41
원래의
856명이 탐색했습니다.

How to Dump Goroutine Stacks Without Stopping a Go Process?

Go에서 프로세스를 중단하지 않고 고루틴 스택 덤프

실행 중인 Go 프로세스가 주어지면 코드 없이 모든 고루틴에 대한 스택 추적을 캡처할 수 있습니다. 수정 또는 프로세스 종료. 요구 사항을 충족하기 위한 솔루션은 다음과 같습니다.

구현:

  1. 신호 처리기:

    • 신호를 수신하기 위해 sigChan 채널을 만듭니다.
    • sigChan에서 SIGQUIT 신호를 수신하기 위해 goroutine을 시작합니다.
    • 신호가 수신되면 스택 추적을 형식화하고 인쇄합니다.
  2. 신호 알림:

    • signal.Notify(sigChan, syscall.SIGQUIT)를 호출하여 SIGQUIT 신호를 sigChan에 보냅니다. .
  3. 스택 추적 덤핑:

    • 신호 처리기 고루틴에서 런타임.Stack()을 호출하여 스택 추적.
    • 생성된 스택 추적을 인쇄합니다.

예제 코드:

<code class="go">import (
    "fmt"
    "os"
    "os/signal"
    "runtime"
    "syscall"
)

func main() {
    // Create a channel to receive signals
    sigChan := make(chan os.Signal)

    // Start a goroutine to listen for signals and dump stack traces
    go func() {
        stacktrace := make([]byte, 8192)
        for _ = range sigChan {
            length := runtime.Stack(stacktrace, true)
            fmt.Println(string(stacktrace[:length]))
        }
    }()

    // Notify the process to listen for SIGQUIT signals and send them to sigChan
    signal.Notify(sigChan, syscall.SIGQUIT)

    // Do some other work here...
}</code>
로그인 후 복사

실행하여 이 코드를 사용하면 Go 프로세스를 종료하지 않고 SIGQUIT를 Go 프로세스에 보내 스택 추적 덤프를 트리거할 수 있습니다. 이렇게 하려면 kill -6 를 사용합니다. 여기서 Go 프로그램의 프로세스 ID입니다. 출력에는 프로세스 내에서 실행 중인 모든 고루틴의 스택 추적이 포함됩니다.

위 내용은 Go 프로세스를 중단하지 않고 고루틴 스택을 덤프하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿