2011-09-22 10 views
5

Mam biblioteki napisane w C z glib/gobject. Generuje znaczną liczbę informacji o debugowaniu za pośrednictwem wywołania g_debug(). Te informacje są bardzo pomocne w rozwiązywaniu problemów, jednak nie chcę, aby były one wyświetlane, gdy biblioteka jest dołączona do rzeczywistej aplikacji. Tak więc, w zasadzie potrzebuję sposobu na kontrolowanie/filtrowanie informacji debugujących i nie mogłem dowiedzieć się, jak powinien działać z glib. Czy ktoś może wskazać mi właściwy kierunek, proszę?Jak kontrolować poziom informacji o debugowaniu w glib?

Odpowiedz

10

Możesz spróbować ustawić zmienną środowiskową G_DEBUG, jak wspomniano na stronie dewelopera GLib. Proszę odnieść się do sekcji Environment variable pod Running and debugging GLib Applications w http://developer.gnome.org/glib/2.28/glib-running.html.

EDYCJA: Aktualizacja, aby ustawić rejestrator w kodzie. Możesz użyć g_log_set_handler (http://developer.gnome.org/glib/2.29/glib-Message-Logging.html#g-log-set-handler), aby zrobić to w swoim kodzie. Początkowo można ustawić moduł obsługi dziennika na fikcyjną funkcję, która wyświetla nothings &, a następnie można ustawić moduł obsługi dziennika na g_log_default_handler na podstawie argumentu przekazanego dla ustawiania odpowiednich poziomów protokołów. Aby ustawić poziomy rejestrów powyżej ustawionego poziomu, będziesz musiał manipulować wartościami GLogLevelFlags zgodnie ze swoimi potrzebami.
Nadzieję poniżej przykładowy kod dostarczy kilka wskazówek

#include <glib.h> 
#include <stdio.h> 
#include <string.h> 

#define G_LOG_DOMAIN ((gchar*) 0) 

static void _dummy(const gchar *log_domain, 
        GLogLevelFlags log_level, 
        const gchar *message, 
        gpointer user_data) 

{ 
    /* Dummy does nothing */ 
    return ;  
} 

int main(int argc, char **argv) 
{ 
    /* Set dummy for all levels */ 
    g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_MASK, _dummy, NULL); 
    /* Set default handler based on argument for appropriate log level */ 
    if (argc > 1) 
    { 
     /* If -vv passed set to ONLY debug */ 
     if(!strncmp("-vv", argv[1], 3)) 
     { 
      g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, g_log_default_handler, NULL); 
     } 
     /* If -v passed set to ONLY info */ 
     else if(!strncmp("-v", argv[1], 2)) 
     { 
      g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_INFO, g_log_default_handler, NULL); 
     } 
     /* For everything else, set to back to default*/ 
     else 
     { 
       g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_MASK, g_log_default_handler, NULL); 
     } 

    } 
    else /* If no arguments then set to ONLY warning & critical levels */ 
    { 
     g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING| G_LOG_LEVEL_CRITICAL, g_log_default_handler, NULL); 
    } 

    g_warning("This is warning\n"); 
    g_message("This is message\n"); 
    g_debug("This is debug\n"); 
    g_critical("This is critical\n"); 
    g_log(NULL, G_LOG_LEVEL_INFO , "This is info\n"); 
    return 0; 
} 

Nadzieja to pomaga!

+1

To nie jest dokładnie to, czego szukam. Wszystko, co chcę móc przekazać -v, ma pokazywać tylko komunikaty INFO i wyższe, a -vv także debugowanie. Jeśli nie podano parametru, po prostu pokaż OSTRZEŻENIE i KRYTYCZNE. Zasadniczo szukam sposobu na kontrolowanie tego z poziomu aplikacji. O ile rozumiem, zmienna środowiskowa G_DEBUG służy do różnych celów. – dtoux

+0

Dzięki @ another.anon.coward. Dopiero teraz zauważyłem twoją zmianę i to jest dokładnie ta odpowiedź, której szukałem. Cóż, do tego czasu zrobiłem dokładnie to samo, ale dziękuję jednak ;-) – dtoux

1

I wdrożone obsługi niestandardowych dziennika i oto jak się okazało:

void custom_log_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data) 
{ 
    gint debug_level = GPOINTER_TO_INT (user_data); 

    /* filter out messages depending on debugging level */ 
    if ((log_level & G_LOG_LEVEL_DEBUG) && debug_level < MyLogLevel_DEBUG) { 
     return; 
    } 
    else if ((log_level & G_LOG_LEVEL_INFO) && debug_level < MyLogLevel_INFO) { 
     return; 
    } 

    g_printf ("%s\n", message); 

} 

int main(int argc, char *argv[]) 
{ 
    ... 
    if (verbose) { 
     g_log_set_handler (NULL, G_LOG_LEVEL_MASK, custom_log_handler, GINT_TO_POINTER (MyLogLevel_DEBUG)); 
    } 
    else { 
     g_log_set_handler (NULL, G_LOG_LEVEL_MASK, custom_log_handler, GINT_TO_POINTER (MyLogLevel_NORMAL)); 
    } 
    ... 
} 

Mam nadzieję, że będzie to pomocne dla kogoś :-)

Powiązane problemy