1. #1
    Membre régulier Avatar de Persistant
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    septembre 2016
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : septembre 2016
    Messages : 50
    Points : 73
    Points
    73

    Par défaut [gdb]Comment debugger des programmes G

    Bonjour à tous,

    Avant, pour débugger je faisais des printf. Mais avec le temps et la complexité toujours croissante de mes programme...
    ... ça devenait insoutenable. Alors j'ai implémenté des fonctions de sérialisation du style my_object_to_string() mais très vite ca deviens l'enfer dans ma console.

    Aujourd'hui j'utilise gdb pour visualiser les données mais ce n'est pas toujours évident avec les GList, les GObject, GtkWidget, etc...

    Ainsi, j'ai commencer a utiliser ce qu'on appel des pretty-printer. Et j'en suis plutôt content.

    Seulement voila. Hier, je suis tombé sur un nouveau bug avec les cairo_path_t j'ai donc créer le nécessaire pour visualiser ce que contenait CairoPath et ainsi détecter rapidement le bug.
    Sans pretty-printer Avec pretty-printer Avec pretty-printer
    Nom : qtcreator_cairo_path_t.png
Affichages : 52
Taille : 25,4 Ko Nom : cairo_path_t.png
Affichages : 53
Taille : 14,5 Ko Nom : console_cairo_path_t.png
Affichages : 48
Taille : 7,9 Ko

    Le code nécessaire
    Code py : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    class cairo__PathPrinter:
    	"Prints a cairo_path_t"
     
    	class _iterator:
    		"Iterator by cairo_path_data_t.header"
     
    		def __init__(self, path):
    			self.path = path
    			if path:
    				self.data   = path["data"]
    				self.num_data = path["num_data"]
    				#self.status = path["status"]
    			self.pos = 0
    			self.command = ""
    			self.points = {}
    			self.attributes= []
     
    		def __iter__(self):
    			return self
     
    		def next(self):
    			if not self.path:
    				raise StopIteration
    			if self.pos >= self.num_data:
    				raise StopIteration
     
    			length = int(self.data[self.pos]["header"]["length"])
    			end = self.pos + length
    			self.command = self.data[self.pos]["header"]["type"]
    			self.points = {}
    			self.attributes= []
    			index = 1
    			suff = ""
    			if length>2:
    				suff = "1"
    			self.pos += 1
    			while self.pos < end:
    				self.points["x%s" % suff] = float(self.data[self.pos]["point"]["x"])
    				self.points["y%s" % suff] = float(self.data[self.pos]["point"]["y"])
    				self.attributes.append("x%s" % suff)
    				self.attributes.append("y%s" % suff)
    				self.pos += 1
    				index += 1
    				suff = "%d" % index
    			return (self.command, self.points, self.attributes)
     
    		__next__ = next # Python 3: def __next__(self)
     
    	def __init__ (self, val):
    		self.path = val
     
    	def segment(self):
    		return self._iterator(self.path)
     
    	def count(self):
    		size = 0
    		for seg in self.segment(): size += 1
    		return size
    Mais je dois bien me rendre a l'évidence que je ne suis pas un killer en Phython et je perd beaucoup de temps simplement pour pourvoir voir les données en mémoire.


    Aujourd'hui je voudrai utiliser les pretty-printer avec gdb dans mes programme utilisant GLib, Cairo, GObject, Gtk+. Savez-vous ou je pourrai trouver ces fonctions ?

    Citation Envoyé par Documentation gdb
    Suppose we have three pretty-printers installed: one from library1.so named foo that prints objects of type foo, and another from library2.so named bar that prints two types of objects, bar1 and bar2.
    Savez-vous ou je pourrais trouver ces fameuses fonctions pour chaque bibliothèque (GLib, GObject, Cairo, Gtk+) ?
    J'ai cherché partout, et je m'étonne de ne pas trouver... Comment gnome peut-il bien faire sans ?

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2009
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2009
    Messages : 1 282
    Points : 1 920
    Points
    1 920

    Par défaut

    Bonjour,

    Tu as des fonctions de logging dans la GLib, et depuis quelques temps du logging structuré:
    https://developer.gnome.org/glib/sta...e-Logging.html
    https://blog.gtk.org/2017/05/04/logging-and-more/
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  3. #3
    Membre régulier Avatar de Persistant
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    septembre 2016
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : septembre 2016
    Messages : 50
    Points : 73
    Points
    73

    Par défaut

    Merci pour ton aide.
    Je me garde le logging sous le coude.


    En réalité, je recherchais ca:
    pour la lib GObject : https://git.gnome.org/browse/glib/tr...py?h=glib-2-32
    pour la lib GLib : https://git.gnome.org/browse/glib/tr...py?h=glib-2-32


    Mais j'ai rien trouvé pour Cairo et Gtk+...

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    novembre 2010
    Messages
    2 310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : novembre 2010
    Messages : 2 310
    Points : 6 189
    Points
    6 189

    Par défaut

    salut,

    juste par curiosité, ça rend quoi visuellement le pretty-printer Glib dans gdb ?
    Avant donc que d'écrire, apprenez à penser.
    Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
                                                        - Nicolas Boileau, L'Art poétique

  5. #5
    Membre régulier Avatar de Persistant
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    septembre 2016
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : septembre 2016
    Messages : 50
    Points : 73
    Points
    73

    Par défaut Pour assouvir ta curiosité

    Imaginons que j'ai ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    int
    main (int argc, char *argv[])
    {
    	GList *list = NULL;
    	gchar *un = "un";
    	gchar *deux = "deux";
    	gchar *trois = "trois";
     
    	list = g_list_append(list, un);
    	list = g_list_append(list, deux);
    	list = g_list_append(list, trois);
     
    	g_list_free(list);
     
    	return 0;
    }
    Voici ce que donne le pretty-printer de la bibliothèque Glib avec gdb dans la console
    Nom : gforeach.png
Affichages : 31
Taille : 8,9 Ko

  6. #6
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2009
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2009
    Messages : 1 282
    Points : 1 920
    Points
    1 920

    Par défaut

    Ok, je n'avais pas compris la question, je ne connaissais pas ces pretty-printer.
    Voilà la doc dans GDB pour les curieux.
    https://sourceware.org/gdb/onlinedoc...y-Printing-API

    Pour GTK+, le même pretty printer de gobject devrait fonctionne, puisque GTK+ est basé sur GObject.
    Pour cairo, je crois qu'il n'utilis pas de type opaque, tu dois avoir moyen de juste afficher le contenu des structures et voir leur contenu.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/01/2012, 13h52
  2. comment debugger le programme d'autrui ?
    Par fred0655 dans le forum Zend
    Réponses: 4
    Dernier message: 26/03/2008, 21h41
  3. Comment debugger un programme en C ?
    Par condor_01 dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 14/11/2007, 19h06
  4. Comment rendre les programmes compatibles sur Vista ?
    Par wa3dbk dans le forum Windows Vista
    Réponses: 1
    Dernier message: 06/10/2007, 17h58
  5. Réponses: 1
    Dernier message: 13/07/2007, 15h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo