Maison > développement back-end > Golang > le corps du texte

Pourquoi les arguments de fonction dans les traces de la pile Go sont-ils parfois affichés sous la forme de valeurs apparemment sans rapport ?

Susan Sarandon
Libérer: 2024-11-05 16:44:02
original
1036 Les gens l'ont consulté

Why are function arguments in Go stack traces sometimes displayed as seemingly unrelated values?

Dévoilement du mystère du « champ inconnu » dans les traces de pile de panique

Dans le domaine du débogage, rencontrer des entrées énigmatiques dans les traces de pile de panique peut être déroutant. Un tel cas se présente lors de l'analyse de la sortie d'un simple programme Go :

<code class="go">package main

func F(a int) {
    panic(nil)
}

func main() {
    F(1)
}</code>
Copier après la connexion

Lors de son exécution, le programme produit une trace de pile imprévue :

panic: nil

goroutine 1 [running]:
main.F(0x1, 0x10436000)
    /tmp/sandbox090887108/main.go:4 +0x20
main.main()
    /tmp/sandbox090887108/main.go:8 +0x20
Copier après la connexion

Le deuxième nombre dans le cadre de pile , 0x10436000, reste insaisissable dans son objectif. Pour déchiffrer cette énigme, nous devons nous plonger dans les subtilités de la représentation de la mémoire de Go et de la génération de traces de pile. les données affichées dans la trace de la pile proviennent des arguments de la fonction, mais leurs valeurs diffèrent de celles explicitement transmises. La raison réside dans la façon dont les arguments sont stockés et imprimés dans certaines architectures de mémoire.

Plus précisément, dans le cas de la environnement de jeu utilisé, une architecture de mots de 64 bits avec des pointeurs de 32 bits (GOARCH=amd64p32) entre en jeu. Cette combinaison particulière entraîne l'impression des arguments sous forme de valeurs de la taille d'un pointeur, ce qui coïncide généralement avec la taille du mot natif. Cependant, dans ce cas, la taille du mot est deux fois supérieure à la taille du pointeur.Par conséquent, chaque mot de 64 bits peut contenir deux arguments, ce qui conduit à l'impression d'un nombre pair de valeurs dans les arguments du cadre. Les données présentées sont essentiellement les valeurs d'arguments brutes stockées dans des morceaux de la taille d'un pointeur.

Autres exemples : Explorer la variabilité de la représentation des données

Pour illustrer ce phénomène, considérons le fonction suivante :

Lorsqu'elle est appelée avec l'argument 1, la trace de pile révèle :

Ici, seuls les 8 premiers bits du mot de 64 bits sont utilisés, représentant la valeur 1. Les bits restants sont simplement des parties inutilisées du mot de 64 bits.

<code class="go">func F(a uint8) {
    panic(nil)
}</code>
Copier après la connexion
De même, sur les systèmes amd64 avec plusieurs arguments, chaque argument de 32 bits consomme un mot de 64 bits. Par exemple :

main.F(0x97301, 0x10436000)
Copier après la connexion
Lorsqu'elle est invoquée avec F(1, 1, 1), la trace de la pile affiche :

indiquant deux mots alloués aux arguments.

<code class="go">func F(a, b, c uint32)</code>
Copier après la connexion

Valeurs de retour : dévoiler la présence cachée dans les traces de pile

main.F(0x100000001, 0xc400000001)
Copier après la connexion

Les cadres de pile intègrent également des valeurs de retour, qui sont allouées sur la pile. Par exemple :

Sur amd64, les arguments du cadre de pile apparaîtront comme :

Le premier mot représente l'argument d'entrée, tandis que les deux mots restants contiennent les valeurs de retour.

<code class="go">func F(a int64) (int, int)</code>
Copier après la connexion

Conclusion

main.F(0xa, 0x1054d60, 0xc420078058)
Copier après la connexion

Comprendre les subtilités de la représentation de la mémoire et de la génération de traces de pile dans Go permet aux développeurs de déchiffrer même les entrées les plus énigmatiques dans les traces de pile de panique. En résolvant l'énigme du « champ inconnu », les programmeurs peuvent déboguer et résoudre efficacement les problèmes, obtenant ainsi des informations inestimables sur le fonctionnement interne de leur code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal