패닉 스택 추적의 "알 수 없는 필드" 이해
패닉 스택 추적을 해독하는 과정에서 익숙하지 않은 요소를 만날 수 있습니다. 이러한 인스턴스 중 하나는 패닉 스택 추적에서 함수 호출의 두 번째 인수 내에서 발생합니다.
이를 설명하기 위해 다음 코드를 고려해 보겠습니다.
<code class="go">package main func F(a int) { panic(nil) } func main() { F(1) }</code>
실행 시 이 코드는 다음을 출력합니다.
panic: nil goroutine 1 [running]: main.F(0x1, 0x10436000) /tmp/sandbox090887108/main.go:4 +0x20 main.main() /tmp/sandbox090887108/main.go:8 +0x20
main.F(0x1, 0x10436000)의 두 번째 인수(0x10436000)에 대한 설명이 필요합니다.
알 수 없는 필드 디코딩
The 스택 추적에 표시되는 값은 함수의 인수이지만 전달된 값과 직접적으로 일치하지는 않습니다. 대신 포인터 크기 값으로 저장된 원시 데이터를 나타냅니다.
이 경우 플레이그라운드는 32비트 포인터(GOARCH=amd64p32)를 사용하는 64비트 아키텍처에서 실행됩니다. 이러한 설정에서 각 값은 64비트 워드에 저장되는 반면 포인터는 32비트입니다.
F(a int) 함수는 int 유형의 단일 인수를 사용합니다. 스택 추적 인수는 64비트 워드로 저장됩니다. 포인터 크기가 32비트이므로 처음 32비트에는 인수(0x1)에 대한 포인터가 포함되고 나머지 32비트(0x10436000)는 사용되지 않습니다.
추가 예
이 개념을 더 자세히 설명하기 위해 다른 예를 살펴보겠습니다.
<code class="go">func F(a uint8) { panic(nil) } func main() { F(1) }</code>
이 코드는 다음을 출력합니다.
panic: nil goroutine 1 [running]: main.F(0x97301, 0x10436000)
여기서 인수 a는 uint8 유형이며 8을 차지합니다. 비트. 64비트 워드의 처음 8비트에는 a(1)의 값이 포함되고 나머지 56비트(0x97300 및 0x10436000)는 사용되지 않습니다.
반환 값
인수 외에도 스택 프레임에는 스택에 할당된 반환 값도 표시됩니다. 예를 들어 amd64 시스템에서 함수 서명:
<code class="go">func F(a int64) (int, int)</code>
은 스택 프레임 인수를 다음과 같이 표시합니다.
main.F(0xa, 0x1054d60, 0xc420078058)
첫 번째 값은 인수를 나타내고 두 개의 후속 값은 반환 값(int 및 int) 하지만 반환값은 초기화되지 않기 때문에 그다지 유용한 정보를 제공하지는 않습니다.
위 내용은 Go Panic 스택 추적의 "알 수 없는 필드"는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!