vivir trastorno testimonios personas gente generalizada depresion con comentarios comandos cluster causas ansiedad go

go - trastorno - Campo desconocido en el seguimiento de la pila de pánico



trastorno de ansiedad generalizada causas (1)

Los datos impresos en el seguimiento de pila son los argumentos, pero los valores no se corresponden directamente con los argumentos pasados, son los datos sin procesar impresos en valores de tamaño de puntero (aunque generalmente es el mismo que el tamaño de palabra nativo). El patio de recreo es ligeramente único, ya que es una arquitectura de palabra de 64 bits con punteros de 32 bits ( GOARCH=amd64p32 ).

En traceback.go puede ver que los valores se imprimen al pasar por los argumentos basados ​​en el tamaño del puntero;

for i := uintptr(0); i < frame.arglen/sys.PtrSize; i++ {

Por lo tanto, debido a que el tamaño de palabra es dos veces más grande que el tamaño del puntero en el área de juegos, siempre tendrá un número par de valores impresos en los argumentos del marco.

Otro ejemplo de cómo se presentan los datos se puede ver en el área de juegos al usar tipos más pequeños en los argumentos de la función: https://play.golang.org/p/vHZDEHQZLh

func F(a uint8) { panic(nil) } // F(1) // main.F(0x97301, 0x10436000)

Solo se utilizan los primeros 8 bits de la palabra de 64 bits, que es 0x97301 & 0x0f , o simplemente 1 . El 0x97300 adicional del primer valor y el 0x10436000 completo son solo el resto de esa primera palabra de 64 bits que la función no utiliza.

Puede ver el mismo comportamiento en los sistemas amd64 usando más argumentos. Esta firma por ejemplo;

func F(a, b, c uint32)

cuando se llama a través de F(1, 1, 1) , imprimirá una traza de pila como:

main.F(0x100000001, 0xc400000001)

porque los 3 valores de 32 bits toman 2 palabras

El conjunto final de valores a tener en cuenta son los valores de retorno, que también se asignan en la pila. La siguiente función de firma:

func F(a int64) (int, int)

en amd64, mostraría los argumentos de marco de pila como:

main.F(0xa, 0x1054d60, 0xc420078058)

Con una palabra para a , y dos más para los valores de retorno (int, int) . Sin embargo, los valores de retorno no se inicializan, por lo que no hay mucho para mí aquí, aparte de entender por qué estos valores están ahí.

Al tratar de aprender a depurar los rastros de pila de los pánicos, encontré algo confuso.

package main func F(a int) { panic(nil) } func main() { F(1) }

produce lo siguiente cuando lo ejecuto en el enlace de reproducción adjunto:

panic: nil goroutine 1 [running]: main.F(0x1, 0x10436000) /tmp/sandbox090887108/main.go:4 +0x20 main.main() /tmp/sandbox090887108/main.go:8 +0x20

No puedo descifrar qué significa el segundo número (el 0x10436000 en main.F (0x1, 0x10436000)). No aparece si hay un segundo argumento int, o si algo más si se pasa como primer argumento (se puede ver en el segundo enlace de reproducción).

Un argumento: https://play.golang.org/p/3iV48xlNFR

Dos argumentos: https://play.golang.org/p/4jA7ueI86K