> 백엔드 개발 > Golang > 패닉 스택 추적의 '알 수 없는 필드'는 무엇을 나타냅니까?

패닉 스택 추적의 '알 수 없는 필드'는 무엇을 나타냅니까?

Patricia Arquette
풀어 주다: 2024-11-05 00:08:02
원래의
790명이 탐색했습니다.

What does the

패닉 스택 추적의 "알 수 없는 필드" 이해

패닉에서 스택 추적을 분석하는 동안 함수 이름 뒤에 낯선 숫자가 나타날 수 있습니다. 예를 들어, 다음 코드를 실행하면

<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). 결과적으로 함수 인수가 인쇄될 때마다 다음이 발생합니다.

  • 단어 크기가 포인터 크기의 두 배이므로 프레임 인수에 짝수 개의 값이 인쇄됩니다. .
  • 64비트 워드의 처음 32비트만 사용하고 나머지 비트는 사용하지 않습니다.

인수 데이터의 예

다음 함수를 고려하세요. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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