2013-04-16 12 views
5

Używam jako program rejestrujący dla mojego programu C++. Podczas rozwoju I często wykorzystują to w ten sposób, na przykład:Jak usunąć instrukcje debugowania dzienników z programu

#define LOG(severity) BOOST_LOG_SEV(boost::logger::get(), (severity)) 
#define LOG_ERR LOG(Severity::error) 
#define LOG_INFO LOG(Severity::info) 
#define LOG_DEBUG LOG(Severity::debug) 

gdzie BOOST_LOG_SEV jest dostarczane przez zakład boost::log, natomiast LOG, LOG_ERROR, LOG_INFO, LOG_DEBUG skróty są zdefiniowane przez mnie.

W skrócie, BOOST_LOG_SEV dynamicznie porównuje aktualną intensywność debugowania ze stopniem istotności przekazywanym do samego makra, aby zdecydować, czy emitować wyjście, czy nie.

ten jest przykładem programu, który wykorzystać powyższe makra dla celów debugowania:

// set at compile time 
#define MAX_LOG_SEVERITY Severity::debug 

int main() { 
    // Print all the messages with a 
    // Severity <= MAX_LOG_SEVERITY defined before compiling 
    boost::log::set_severity(boost::logger::get(), MAX_LOG_SEVERITY); // set_severity() is fictitious just to give you an idea 

    // bool err = ... 
    if (err) 
     LOG_ERR << "An error occurred"; 
    else 
     LOG_INFO << "Okay; 
    LOG_DEBUG << "main() called"; 
} 

Teraz, gdy uwalniając program dla środowiska produkcyjnego, debugowania wiadomości z Severity::debug poziomie tak naprawdę nie ma sensu. Mogłabym je ukryć przed wyjściem, po prostu zmniejszając o MAX_LOG_SEVERITY do Severity::info, ale problem polega na tym, że połączenia wykonane przez LOG_DEBUG nie zostaną usunięte z kodu wykonywalnego. Ma to zły wpływ na wydajność i wielkość obiektu.

Kod jest pełen instrukcji logowania i chciałbym zachować proste użycie operator<<().

Bez dotykania te oświadczenia się, czy istnieje lepsza definicja makra/trick LOG_DEBUG która stałaby pre-procesor lub kompilator (podczas jego optymalizacje) „skip” lub „usuń” oświadczenia debugowania podczas MAX_LOG_SEVERITY jest ustawiony na stała Severity::debug?

Odpowiedz

6

Chociaż nie można dokonywać żadnych gwarancji, coś jak to może działać. To zależy od tego, co robi twój optymalizator i czy masz efekty uboczne w parametrach do operatora < <.

#ifdef NO_LOG_DEBUG 

static class DevNull 
{ 
} dev_null; 

template <typename T> 
DevNull & operator<<(DevNull & dest, T) 
{ 
    return dest; 
} 

#define LOG_DEBUG dev_null 

#else 

#define LOG_DEBUG LOG(Severity::debug) 

#endif 
-2

Wyłącza wszystkie optymalizacje w programie i przyspiesza kompilację.

/OD lub boot_log_stop

2

@ MartinShobe zaakceptowany odpowiedź działa na:

  • g ++ (4.7.2) z -O1 i wyższej
  • brzękiem ++ (3.4) z -O2 i wyższej
  • Visual Studio (2008) z flaga linkera /OPT:REF
Powiązane problemy