On peut définir des messages dans le code en utilisant des fonctions Glib comme debug ()
, qui ne sont journalisées que lorsque le niveau de journalisation est suffisamment élevé, par exemple en utilisant l'environnement G_MESSAGES_DEBUG
variable.
Est-il également possible de mettre du code dans une sorte de conditionnel qui n'est déclenché qu'avec un certain niveau de journalisation?
Par exemple, j'aimerais que le code suivant ne soit exécuté que lorsque le débogage est activé:
foreach (var object in list) { debug (" object: %s", object.id); }
3 Réponses :
Le gestionnaire de journal par défaut utilise des env. vars G_MESSAGES_PREFIXED et G_MESSAGES_DEBUG. Vous utilisez g_log () ou un version spécialisée (g_error (), g_assert (), g_critical (), g_return_if_fail () et g_return_val_if_fail (), g_warning (), voir g_message (), g_debug ()) pour énoncer le message.
Si vous souhaitez ajouter à votre code des instructions de débogage, vous pouvez vérifier la variable d'environnement:
valac pre_parser_directive.vala -D DEBUG
Un codeur expert suggérerait d'utiliser un débogueur pour parcourir le code. Cela signifie que vous n'avez pas besoin d'ajouter des instructions supplémentaires juste pour le débogage, mais c'est un peu difficile avec Vala. Voici un exemple. Le programme Vala est:
void main () { #if DEBUG print ("debugging...\n"); #endif }
Compile avec:
break function_breakpoint_example.vala:9
--debug
comprend la ligne nombres pour le code Vala dans le C. -X -O0
généré passe -O0
au compilateur C afin que les informations ne soient pas optimisées. --save-temps
conserve les fichiers C temporaires générés par Vala afin que le débogueur puisse les référencer.
Maintenant, exécutez le débogueur gdb
: p >
gdb ./function_breakpoint_example ...enters gdb... break test_run run # Program runs and then stops when Test.run is entered step # or `cont` if you want to continue on to the end of the program
Vous devez comprendre comment Vala convertit ses noms de symboles en noms de symboles C. Dans cet exemple, un espace de noms est utilisé, donc Test.run
est converti en fonction test_run
en C. break test_run
dit à GDB d'arrêter d'exécuter le programme lorsque cette fonction est appelée.
Vous pouvez définir un point de rupture en utilisant un numéro de ligne dans un fichier source, par exemple
valac function_breakpoint_example.vala --debug -X -O0 --save-temps
Il existe toute une gamme de commandes pour obtenir plus d'informations, comme une trace de pile complète ou imprimer des variables locales. info args
affichera les arguments passés à la fonction, pa
affichera le contenu de la variable a
et info locals
imprimera les variables locales. Certaines informations imprimées seront plus compréhensibles que d'autres informations.
Une autre option, qui ajoute à nouveau des instructions à votre code, est d'utiliser une directive de pré-parser Vala. Cela empêche Vala de passer le code à travers tout le processus de compilation si une condition n'est pas définie. Par exemple:
void main () { var a = "before"; var b = Test.run (a); print (@"$(b)\n"); } namespace Test { string run (string a) { return "after"; } }
lorsqu'il est compilé avec:
void main () { if (Environment.get_variable ("G_DEBUG") == "fatal-criticals") { print ("Debug code\n"); } }
inclura l'instruction print
dans le C. généré. Sans -D DEBUG
, cette partie du code Vala ne sera pas analysée et n'apparaîtra donc pas dans la sortie finale.
La manière officiellement recommandée * de conditionner certains codes à l'activation de la sortie de débogage est de vérifier vous-même la valeur de la variable d'environnement G_MESSAGES_DEBUG
. Si sa valeur est all
ou s'il contient le domaine qui vous intéresse, activez votre code.
Il n'y a pas de fonction d'assistance pour cela - vous devriez écrire la vôtre.
* Je suis un développeur en amont.