>백엔드 개발 >Golang >Running Go 프로세스에서 모든 고루틴에 대한 스택 추적을 얻는 방법은 무엇입니까?

Running Go 프로세스에서 모든 고루틴에 대한 스택 추적을 얻는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-31 15:38:37615검색

How to Get Stack Traces for All Goroutines in a Running Go Process?

실행 중인 Go 프로세스에서 모든 고루틴에 대한 스택 추적을 덤프하는 방법

Go 프로세스를 디버깅하거나 문제를 해결할 때 모든 고루틴에 대한 스택 추적을 얻습니다. 고루틴은 매우 중요할 수 있습니다. 그러나 소스 코드를 수정하거나 프로세스를 종료하지 않고 이를 수행하는 것은 어려울 수 있습니다. 이 가이드는 이 문제에 대한 해결책을 제공합니다.

Go 런타임에는 요청 시 스택 추적을 덤프할 수 있는 기능이 포함되어 있습니다. 그러나 프로세스 외부에서 이 기능을 호출하는 것은 즉시 명백하지 않습니다.

신호 처리기 사용

모든 고루틴에 대한 스택 추적을 캡처하려면 신호를 설정할 수 있습니다. 특정 신호를 수신하는 핸들러. 신호가 수신되면 핸들러는 스택 추적을 생성하고 인쇄합니다.

다음은 예제 코드 조각입니다.

<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 that will write stack traces to the channel.
    go func() {
        // Create a buffer to hold the stack trace.
        stacktrace := make([]byte, 8192)

        // Loop until a signal is received.
        for _ = range sigChan {
            length := runtime.Stack(stacktrace, true)
            fmt.Println(string(stacktrace[:length]))
        }
    }()

    // Register to receive SIGQUIT signals.
    signal.Notify(sigChan, syscall.SIGQUIT)

    // Continue with the main application logic.
    ...
}</code>

신호 보내기

핸들러가 설정되면 SIGQUIT 신호를 프로세스에 보내 스택 추적 덤프를 트리거할 수 있습니다. 다음 명령을 사용하여 이 작업을 수행할 수 있습니다.

kill -QUIT <process id>

여기서 Go 프로세스의 ID입니다.

사용 예

다음은 예제 시나리오입니다.

  1. 위에 제공된 코드 조각을 다음과 같이 실행합니다. 별도의 Go 프로세스.
  2. 프로세스가 실행 중일 때 터미널 창을 열고 kill 명령을 입력합니다.

    kill -QUIT <process id>

스택은 모든 Go 프로세스에 대해 추적합니다. Go 프로세스의 고루틴은 터미널 창에 인쇄됩니다.

위 내용은 Running Go 프로세스에서 모든 고루틴에 대한 스택 추적을 얻는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.