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
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!
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ś :-)
- 1. Wyświetlanie informacji o debugowaniu w konsoli
- 2. Awaria aplikacji .NET bez informacji o debugowaniu
- 3. Scalanie informacji o debugowaniu podczas łączenia bibliotek statycznych
- 4. Jak skonfigurować glib w Makefile?
- 5. Błąd Paranamer z powodu braku informacji o debugowaniu w skompilowanych plikach klas.
- 6. Czy generowanie informacji o debugowaniu (pdb) powoduje spowolnienie mojej aplikacji w środowisku wykonawczym?
- 7. Skąd wiadomo, jaki typ informacji o debugowaniu znajduje się w pliku obiektów ELF?
- 8. Jak uzyskać dokładniejsze informacje o debugowaniu wiersza/col z klang?
- 9. Jak uzyskać informacji o urządzeniach w Androidzie
- 10. Informacje o debugowaniu dla ładowalnych modułów jądra
- 11. połączenie debugowania z urllib2 + httplib.debuglevel czasami nie wyświetlające informacji o debugowaniu
- 12. GAsyncQueue GLib vs POSIX message_queue
- 13. Jak skompilować podstawowy przykład D-Bus/glib?
- 14. Flaga Java, aby włączyć rozszerzone informacje o debugowaniu szeregowym
- 15. Uzyskiwanie informacji o obiekcie Startup.cs
- 16. Lista wszystkich informacji o sesji
- 17. Mercurial - wyświetlanie informacji o użytkownikach
- 18. Jak mogę debugować ten błąd: "Nie można znaleźć informacji o debugowaniu dla iisexpress.exe lub się nie zgadza?"
- 19. Uzyskiwanie aktywnych informacji o oknie w Javie
- 20. Umieszczanie informacji o konfiguracji w bibliotece DLL
- 21. Zapisywanie informacji o użytkowniku w ustawieniach aplikacji
- 22. Czytanie informacji o certyfikacie pkcs12
- 23. Parse.com - odświeżanie informacji o użytkowniku
- 24. Dlaczego kontrolować dopełnienie o wysokości linii?
- 25. uzyskiwanie informacji o zależnościach maven
- 26. Utrata odbicia w Java informacji o adnotacjach
- 27. Mylić o zdalnym debugowaniu w Visual Studio 2010
- 28. Przechowywanie informacji o zaznaczeniu tekstu w przeglądarce
- 29. Wywoływanie informacji o właściwościach hybrydowych w SQLAlchemy
- 30. Co exc_breakpoint oznacza w debugowaniu?
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
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