패닉에서 스택 추적을 분석하는 동안 함수 이름 뒤에 낯선 숫자가 나타날 수 있습니다. 예를 들어, 다음 코드를 실행하면
<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
두 번째 숫자(0x10436000)는 수수께끼처럼 보일 수 있습니다. 이를 디코딩하려면 스택 트레이스 데이터의 성격을 파헤쳐야 합니다.
스택 트레이스에 출력되는 데이터는 함수 인수로 구성됩니다. 그러나 이러한 값은 전달된 인수와 직접적으로 일치하지 않습니다. 대신 메모리에 저장된 원시 데이터, 특히 포인터 크기 값을 나타냅니다.
Playground 환경에서는 독특한 상황이 발생합니다. 64비트 워드 아키텍처에는 32비트 포인터가 있습니다(GOARCH=amd64p32). 결과적으로 함수 인수가 인쇄될 때마다 다음이 발생합니다.
다음 함수를 고려하세요. call:
<code class="go">F(1)</code>
결과 스택 추적은 다음과 같습니다.
main.F(0x97301, 0x10436000)
이 경우 uint8 인수(1)는 64비트 단어의 처음 8비트(0x97301)만 차지합니다. & 0x0f). 추가 0x97300 및 0x10436000 전체는 단어의 사용되지 않은 부분을 나타냅니다.
다음과 같은 더 복잡한 기능의 경우:
<code class="go">func F(a, b, c uint32)</code>
다음으로 호출:
<code class="go">F(1, 1, 1)</code>
스택 추적에 다음이 표시됩니다.
main.F(0x100000001, 0xc400000001)
세 개의 32비트 값이 두 단어를 차지하기 때문입니다.
반환 값은 다음 함수에서 볼 수 있듯이 stack:
<code class="go">func F(a int64) (int, int)</code>
amd64에서 스택 프레임 인수는 다음과 같이 나타납니다.
main.F(0xa, 0x1054d60, 0xc420078058)
입력에 한 단어, 반환 값에 두 단어 포함 . 반환 값은 초기화되지 않으므로 이 정보는 제한적으로만 사용됩니다.
위 내용은 패닉 스택 추적의 '알 수 없는 필드'는 무엇을 나타냅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!