2010-04-15 9 views
6

Tworzę bibliotekę C++, która będzie P/Invoked z C#, więc nie jestem w stanie złamać/debugować strony C++ rzeczy. Postanowiłem więc dodać rejestrację, aby sprawdzić, czy coś pójdzie nie tak i gdzie to się dzieje. Dodaję #define DebugMode 1 w celu ustalenia, czy mam się logować, czy nie. Przede wszystkim nie jestem zbyt dobry w C++, ale wiem wystarczająco dużo, aby obejść. Więc moje pytania to:Czy istnieje lepszy sposób niż #if DebugMode do logowania

  1. Czy istnieje lepszy sposób niż owijanie #if DebugMode #endif S dookoła każdy rejestr połączeń? Mogę to zrobić po prostu w metodzie Log i po prostu zwrócić, jeśli logowanie nie jest włączone, ale czy to nie oznacza, że ​​wszystkie ciągi logowania będą w zespole?

  2. Jak mogę naśladować to, co robi z jego printf „...” operator umożliwiając mi coś przekazać jak Log("Variable x is {0}", x);

  3. Czy istnieją jakieś sztuczki, takie jak zdobycie numeru linii lub stos informacje o jakimś prześledzić że mogę użyć w logu?

Dzięki!

+0

To nie odpowiada bezpośrednio na pytanie, ale * możesz * debugować kod C++, który jest P/Wywołany z C#, wystarczy w oknie dialogowym "załączyć", upewnij się, że masz opcję "Kod macierzysty" zaznaczoną jako opcję . –

+0

Gdzie mogę znaleźć tę opcję? – Daniel

Odpowiedz

5

Jednym z prostych sposobów jest zdefiniowanie makra, które nie robi niczego, jeśli nie znajdujesz się w trybie debugowania. W ten sposób nie musisz zawijać każdego połączenia w #ifdef.

Prosta implementacja może być:

#if DebugMode 
#define MY_LOG(string, ...) printf(string, __VA_ARGS__) 
#else 
#define MY_LOG(string, ...) 
#endif 

Istnieją inne sposoby i biblioteki (takie jak doładowania), ale to będzie Ci coś szybko.

+0

Czy będzie zawierał wszystkie ciągi debugowania w zespole? Z numerem #if Dziennik debugowania ("coś") #endif ciągi nie zostałyby wkompilowane w złożenie, jeśli debugowanie jest wyłączone? Czy to jest takie samo dla twojego rozwiązania, ponieważ podoba mi się jego wygląd – Daniel

+0

Struny zostaną rozebrane przez preprocesor, jeśli tryb DebugMode jest ustawiony na 0. Mówisz po prostu 'MY_LOG (" Coś miało wartość% d ", coś);' i jesteś ustawiony. Łańcuchy będą tylko w zespole debugowania. –

+0

Doskonałe dokładnie to, co chciałem! – Daniel

0

Co z debugowaniem biblioteki C++? W bibliotece Project Properties, Debugging wybierz C# client w polu Command i rozpocznij debugowanie.

O rejestrowaniu pytasz o logowanie w C++ lub C#? Bot ma stałe preprocesora zdefiniowane tylko w konfiguracji debugowania, możesz go użyć.

+0

logowanie C++. Nie widzę żadnego klienta C# w tym polu, tylko regsvr32 i możliwość przeglądania – Daniel

+0

Czy znasz nazwę pliku wykonywalnego C#, który wywołuje twoją bibliotekę C++? Wypełnij tę nazwę executavle w polu Polecenie. Jeśli nie znasz nazwy klienta, jak ją uruchomić? –

+0

Och, widzę, nie byłem pewien, co powinienem włożyć. Dzięki! – Daniel

2

Jeśli warunek jest kompilacji czas na stałym poziomie, więc kodzie (po przerób) przekłada się na coś takiego:

if (0) 
    do the logging 

wówczas kompilator będzie generalnie być wystarczająco silny, aby rozebrać się martwego kodu, w tym ciągi, które przekazałeś do niego (chyba że używałeś również napisów w innym kodzie, który oczywiście nie został usunięty).

kod, który działa jak printf jest dość prosta:

#include <stdarg.h> 

void log(char const &fmt, ...) { 
    if (do_logging) { 
     va_list args; 

     va_start(args, fmt); 
     vfprintf(output_file, fmt, args); 
    } 
} 

W makro (to ważne, że być w makro, a nie o nazwie funkcji) można wykorzystać __FILE__ i __LINE__ dla bieżącego numeru linii i nazwa pliku źródłowego do umieszczenia w dzienniku. Z powyższym kodem (prawdopodobnie) chcesz przekazać je przed ciągiem formatującym.

+0

Bardzo pomocne dzięki! No dobra, po prostu przekażę je jako argumenty do metody logowania – Daniel

2

Polecam używanie Pantheios, a następnie nigdy nie musisz dbać o DEBUG /! DEBUG. Biblioteka używa szablonów C++, aby upewnić się, że koszty wydajności nie są płacone, gdy rejestrowanie nie jest włączone. Jest również w 100% bezpieczny dla typów i rozszerzalny dla typów zdefiniowanych przez użytkownika.

Aby uzyskać więcej informacji, sprawdź ich numer performance page.

+1

Sprawdzę to, brzmi bardzo fajnie – Daniel

+0

Niestety, ta sama strona wyraźnie pokazuje koszty wydajności, gdy logowanie nie jest włączone. – Cookie

+0

Dlaczego jest ci przykro? Strona pokazuje koszty względne, gdy logowanie jest włączone i gdy nie jest włączone. W obu przypadkach Pantheios ma lepszą wydajność. (Pamiętaj, że skala kosztów jest logarytmiczna.) – dcw

Powiązane problemy