1
votes

Niveau de journal conditionnel?

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);
}


0 commentaires

3 Réponses :


0
votes

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.


0 commentaires

1
votes

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.


0 commentaires

0
votes

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.


0 commentaires