Au-delà des instructions d'impression : techniques de débogage pour les programmes Go (Section 2)

Mar 27 2023
Dans cette section, nous parlerons du débogage avancé dans le langage de programmation Go. Le débogage d'applications Go complexes peut être décourageant, en particulier lorsqu'il s'agit de problèmes de performances ou de fuites de mémoire.

Dans cette section, nous parlerons du débogage avancé dans le langage de programmation Go. Le débogage d'applications Go complexes peut être décourageant, en particulier lorsqu'il s'agit de problèmes de performances ou de fuites de mémoire. Heureusement, Go propose un puissant outil de profilage et d'analyse des performances des applications : Pprof.

Pprof est un outil de profilage qui vous permet d'identifier les goulots d'étranglement des performances dans votre code en collectant et en analysant les données d'exécution. Avec pprof, vous pouvez obtenir des informations détaillées sur les performances de votre application, y compris des informations sur l'utilisation du processeur, l'allocation de mémoire, etc. En utilisant pprof, vous pouvez optimiser votre code et vous assurer que votre application fonctionne correctement, même sous de lourdes charges. Nous allons explorer comment utiliser pprof pour déboguer et optimiser vos applications Go. Nous couvrirons les bases de pprof, y compris comment collecter des données de profilage et générer des rapports. Nous aborderons également des sujets plus avancés, tels que l'interprétation des rapports de profilage et l'identification des goulots d'étranglement des performances dans votre code.

parlons plus concrètement des outils pprof en Go. Je vais commencer par un simple exemple de code Go. imaginons que nous ayons un programme Go qui utilise beaucoup de mémoire sous de lourdes charges. Nous soupçonnons qu'il pourrait y avoir un goulot d'étranglement de performance dans la randomFunctionfonction, qui effectue certains calculs qui sont au cœur de la fonctionnalité du programme.

import (
 "fmt"
 "net/http"
 "sync"
 "time"

 _ "net/http/pprof"
)

func randomFunction(wg *sync.WaitGroup) {
 defer wg.Done()

 // This piece of code consumes Memory a lot
 var a []int
 for i := 0; i < 2<<30; i++ {
  a = append(a, i)
 }

 time.Sleep(3 * time.Second)
}

func main() {
 var wg sync.WaitGroup

 // Server for pprof
 go func() {
  fmt.Println(http.ListenAndServe("localhost:5500", nil))
 }()
 wg.Add(1)
 wg.Add(1) // we add another to wait program in wg.Wait forever and program can't exit
 go randomFunction(&wg)
 wg.Wait()
}

go run main.go &

go tool pprof http://localhost:5500/debug/pprof/heap

      
                

Dans ce rapport, nous pouvons voir que la randomFunctionfonction occupe une partie importante de la mémoire, puis nous prenons des mesures pour l'optimiser.

En utilisant pprof de cette manière, vous pouvez rapidement identifier les problèmes de performances dans votre code et prendre des mesures pour l'optimiser.

exportons d'abord ce rapport sous forme de fichier image, nous devons d'abord installer un outil :

pour Linux (basé sur Debian) :

apt-get install graphviz gv

brew install graphviz

vous pouvez installer ubuntu WSL et exécuter la commande Linux

maintenant, exécutez à nouveau la commande et au lieu d' toputiliser pngla commande. vous pouvez voir qu'une image créée dans votre espace de travail

essayons cet outil pour obtenir un graphe de goroutines, donc :

go tool pprof http://localhost:5500/debug/pprof/goroutine

et ceci est une image générée :

pprof fournit un outil de visualisation basé sur le Web qui facilite l'analyse des données de profilage. Pour utiliser l'interface Web, vous pouvez accéder à http://localhost:5500/debug/pprof/dans votre navigateur Web. Cela affichera une liste de points de terminaison de profilage que vous pouvez utiliser pour collecter différents types de données de profilage.

Par exemple, pour collecter un profil CPU à l'aide de l'interface Web, vous pouvez cliquer sur le profilelien. Cela téléchargera un fichier de profil binaire sur votre machine locale.

Dans la section suivante, en tant que dernière section pour le débogage dans le langage de programmation Go, je parlerai des techniques d'identification et de résolution des conditions de concurrence, des blocages et d'autres problèmes de concurrence qui peuvent être difficiles à diagnostiquer.