2012-01-19 16 views
8

XCode Düzenleyicisi, Konsolda - NSLog çıktısını okuyabilir, ancak printf()'u okuyamıyorum. Gerçek cihazda printf() sonucunu okumak mümkün mü, simülatörde olduğu gibi mi?iPhone aygıtını hata ayıklama gerçek aygıt

+0

Bunu neden yapmak istediğinizi açıklarsanız yardımcı olabilirsiniz. Neden NSLog() yerine printf kullanmanız gerekiyor? Printf() ifadeleri içeren bir kitaplık kullandığınız için mi? –

+2

Kodumun en büyük kısmı C kodudur. Evrensel olan, rüzgâr, droid, symbian, iOS vb. Altında çalışır. Ve printf() XCode'da iOS simülatörü altında çalışır. – theWalker

cevap

17

En kolay çözüm projenizde küresel printf işlevi aşırı ve NSLog çıkışı ile değiştirmek olacaktır

int printf(const char * __restrict format, ...) 
{ 
    va_list args; 
    va_start(args,format);  
    NSLogv([NSString stringWithUTF8String:format], args) ;  
    va_end(args); 
    return 1; 
} 
+0

Sohaib, büyük teşekkürler. Bu çözüm mükemmel bir şekilde çalışıyor ve tüm C kodlarını hiçbir değişiklik yapmadan bırakabiliyorum :) – theWalker

+0

@skippy: Bu, doğru cevap olarak işaretlenmemeli midir? – newenglander

+2

Bu kod parçasını nereye koymalıyız? – Raptor

-1

Atla, printf(), c nesnesi için değil C nesnesinin çıkış ifadesidir, ayrıca gerçek aygıtta da printf() çalışmıyordur.

+0

Amaç-C, C'nin sıkı bir üst kümesidir, bu yüzden printf() çok fazla belgelenmiş olarak çalışır. Ancak sahnelerin arkasındaki NSLog(), Skippy'nin neden sorun yarattığını gösteren printf() 'den daha fazlasını yapıyor. –

+0

Sorunun aslında printf'in stdout'a yazdırdığını, NSLog'un ise stderr'e yazdırdığını düşünüyorum. –

+2

Nick, fprintf (stderr, format, args); XCode Organizatör Konsolu altında çalışmaz. – theWalker

4

Cihazın konsoluna sadece yazdırmak için aşağıdaki komutu çalıştırabilirsiniz:

syslog(LOG_WARNING, "log string"); 

You Ayrıca syslog ve LOG_WARNING için <sys/syslog.h> #include olarak bildirilmesi gerekir.

+0

Açıkça belirtmeden standart günlük kodlarını kullanabilirsiniz. – wxs

+0

Evet, dediğim gibi, syslog ve LOG_WARNING sys/syslog.h dosyasında açık olarak bildirildi (< and > yanlış kullanım nedeniyle eklenemedi) –

+0

Açık iOS 10 stdout Xcode'a gönderiliyor, bu yüzden artık syslog'a gerek yok. –

8

As Nick Lockwood, yukarıdaki yorumlardan birinde, printf'in stdout'a yazdırdığını ancak NSLog'un stderr'e yazdırdığını söyledi. Printf kullanarak yerine stderr (Xcode konsolu) yazdırmak için fprintf'i kullanabilirsiniz, bu gibi:

fprintf(stderr, "This prints to the Xcode debug console"); 
+0

basit ve obj-C++ ile çalışıyor;) –

+0

, iOS – Sergei

+0

@Sergei için şu anda çalışmıyor, XCode 9.2 üzerinde çalışıyor. NSLog'un bir ön ek olarak çıktıya bazı ek bilgiler eklediğine dikkat edin. Ancak, fprintf yalnızca bir parametre olarak geçtiğinizi kaydeder. Ayrıca, fprintf kendi başına bir \ n yazmaz. –

İlgili konular