실행 중인 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>
여기서
사용 예
다음은 예제 시나리오입니다.
프로세스가 실행 중일 때 터미널 창을 열고 kill 명령을 입력합니다.
kill -QUIT <process id>
스택은 모든 Go 프로세스에 대해 추적합니다. Go 프로세스의 고루틴은 터미널 창에 인쇄됩니다.
위 내용은 Running Go 프로세스에서 모든 고루틴에 대한 스택 추적을 얻는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!