2010-04-15 11 views
6

giriş için DebugMode #if daha iyi bir yolu var mı P/C# dan çağrılan, bu yüzden şeylerin/ayıklama C++ tarafını çalışma noktasının kuramıyorum. Bu yüzden günlüğe kaydetmeye karar verdim, böylece bir şeylerin yanlış gittiğini ve nerede olduğunu görebiliyorum. Giriş yapıp yapmamayı belirlemek için #define DebugMode 1 ekliyorum. Her şeyden Öncelikle ben c çok iyi değilim ++ ama etrafında almak için yeterli biliyorum. Yani benim sorular şunlardır:Bir C++ kütüphanesi şu olacak yapıyorum

  1. her çağrı Log etrafında #if DebugMode #endif s sarma daha iyi bir yolu var mı? Bunu Log yönteminin içinde yapabilirim ve sadece günlüğe kaydetme etkinleştirilmemişse geri dönebilirim, ancak bu demek oluyor ki, tüm bu kayıt dizileri montajda olacak?

  2. i mi Printf onun "..." operatör Log("Variable x is {0}", x);

  3. gibi bir şey iletmemi sağlayan yaptığını, böyle satır numarasını almak ya da bir tür izleme bilgilerini yığını gibi herhangi hileler var taklit nasıl olduğunu Günlükte kullanabilir miyim?

teşekkürler!

+0

Bu, doğrudan soruyu yanıtlamaz, ancak * "*", yalnızca "ek" iletişim kutusundaki C# 'dan P/Çağırılan C++ kodunu hata ayıklayabilir, "Yerel Kod" seçeneğinin bir seçenek olarak işaretlendiğinden emin olun . –

+0

Bu seçeneği nerede bulabilirim? – Daniel

cevap

5

basit bir yolu ayıklama modunda değilseniz sadece hiçbir şey yapmaz bir makro tanımlamaktır. Bu şekilde, her aramayı bir #ifdef içinde sarmanıza gerek yoktur.

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

başka yollar ve (örneğin destek olarak) kütüphaneler vardır ama bu hızla size bir şey alacak:

Basit uygulama olabilir. derleyici genellikle ölü kod çıkarmaz kadar akıllı olacak Sonra

if (0) 
    do the logging 

dahil: koşul Kodunuzdaki böylece (ön işleme sonra), bir derleme zamanı sabiti ise

+0

Bu, montajdaki tüm hata ayıklama dizelerini içerecek mi? #if DebugMode Günlüğü ile ("bir şey") # hata ayıklama devre dışı bırakılırsa dizeler derleme derlenmez mi? Bu sizin çözümünüz için de aynıdır, çünkü onun görünümünü beğendim – Daniel

+0

DebugMode 0 olarak ayarlanmışsa, dizeler önişlemci tarafından sıyrılacaktır. Sadece “MY_LOG (“ Bir şey% d değeri vardı ”deyin); ve sen ayarlandın. Dizeler yalnızca hata ayıklama grubunda olacaktır. –

+0

Mükemmel Ben tam olarak ne istedim! – Daniel

0

Ne C++ kütüphanesi ayıklama hakkında? C++ kütüphanesinde Proje Özellikleri, Hata Ayıklama, Komut alanında C# istemcisi seçin ve hata ayıklamaya başlayın. günlük Hakkında

, yaklaşık C++ veya C# günlüğü soruyorsun? Bot sadece Debug konfigürasyonunda tanımlanan önişlemci sabitlerine sahiptir, bunu kullanabilirsiniz.

+0

C++ günlüğü. Bu alanda herhangi bir C# istemcisi göremiyorum, sadece regsvr32 ve Göz atma yeteneği – Daniel

+0

C++ Dll'nizi arayabilen C# yürütülebilir dosyasının adını biliyor musunuz? Bu yürütme adını Komut alanına doldurun. İstemci adını bilmiyorsanız, onu nasıl çalıştırıyorsunuz? –

+0

Gördüğüm kadarıyla, ne koymak istediğimi bilmiyordum. Teşekkürler! – Daniel

2

gibi bir şey ortaya eserler ona ilettiğiniz dizeler (tabii ki dizileri, çıkarılmayan başka bir kodda kullanmıyorsanız). printf gibi davranır

Kod oldukça basittir:

#include <stdarg.h> 

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

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

bir makro olarak geçerli hat numarası için __FILE__ ve __LINE__ kullanabilirsiniz (buna makro değil denilen işlevi olması önemlidir) ve günlüğe koymak için kaynak dosya adı. Yukarıdaki kodla, (muhtemelen) format dizisinden önce bunları geçmek isteyeceksiniz.

+0

Çok yardımcı teşekkürler! Ah tamam ben sadece argüman olarak – Daniel

2

Ben Pantheios kullanılması önerilir ve sonra DEBUG /! DEBUG önemsemelisin asla. Kütüphane, günlüğe kaydetme etkin olmadığında hiçbir performans maliyetinin ödenmediğinden emin olmak için C++ şablonları kullanır. Ayrıca% 100 tip güvenli ve kullanıcı tanımlı tiplere genişletilebilir.Daha fazla bilgi için

bar_t bar; 

pantheios::log_DEBUG("foo ", bar, " was doing something you should remember"); 

Kontrol dışarı onların performance page.

+1

kayıt yöntemine geçeceğim, kontrol edeceğim, çok havalı geliyor – Daniel

+0

Maalesef, aynı sayfa etkin olmadığında performans maliyetlerini açıkça gösteriyor. – Cookie

+0

Neden üzgünüz? Sayfa, günlüğe kaydetme etkinleştirildiğinde ve etkin olmadığında göreceli maliyetleri gösterir. Her iki durumda da Pantheios üstün performansa sahiptir. (Maliyet ölçeğinin logaritmik olduğunu unutmayın.) – dcw

İlgili konular