2012-01-19 4 views
8

В XCode Organizer, Console - я могу читать вывод NSLog, но не printf(). Можно ли считать результат printf() на реальном устройстве, как и в симуляторе?iPhone отладка реального устройства

+0

Это может помочь, если вы объясните, почему вы хотите это сделать? Зачем вам нужно использовать printf вместо NSLog()? Это потому, что вы используете библиотеку, содержащую инструкции printf()? –

+2

Потому что большая часть моего кода - это код C. Универсальный, работает под windoz, droid, symbian, iOS и т. Д. И printf() работает под симулятором iOS, в XCode. – theWalker

ответ

17

простое решение было бы перегрузить функцию PRINTF глобально в проекте и заменить его на выходе NSLog

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, большое спасибо. Это решение работает отлично, и я могу оставить весь код C без каких-либо изменений :) – theWalker

+0

@skippy: Не следует ли это помечать как правильный ответ? – newenglander

+2

где мы должны положить этот кусок кода? – Raptor

-1

Skippy, printf() - оператор вывода для c не для Objective C, SO в реальном устройстве также printf() не работает.

+0

Objective-C является строгим надмножеством C, поэтому printf() очень хорошо работает как документально. Но NSLog() за кулисами делает больше, чем printf(), что может быть связано с тем, что у Skippy возникают проблемы. –

+0

Я считаю, что проблема заключается в том, что printf печатает на stdout, тогда как NSLog печатает на stderr. –

+2

Ник, fprintf (stderr, формат, args); не работают в консоли XCode Organizer. – theWalker

4

Вы можете выполнить следующую команду для печати только на консоли устройства:

syslog(LOG_WARNING, "log string"); 

вы также необходимо будет # включить <sys/syslog.h> для системного журнала и LOG_WARNING, чтобы быть явно объявлено

+0

Вы можете использовать стандартные коды журналов, явно не объявляя их. Я думаю, – wxs

+0

Да, как я уже сказал, syslog и LOG_WARNING явно объявлены в sys/syslog.h (имя include не было видно из-за неправильного использования < and >) –

+0

On iOS 10 stdout отправляется на Xcode, поэтому syslog больше не нужен. –

8

As Ник Локвуд сказал в одном из комментариев выше, printf печатает на stdout, но NSLog печатает на stderr. Вы можете использовать fprintf для печати на stderr (консоль Xcode) вместо использования printf, например:

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

простой и рабочий с obj-C++;) –

+0

похоже, что он не работает в C++ для iOS – Sergei

+0

@Sergei работает для меня сейчас, на XCode 9.2. Обратите внимание, что NSLog добавляет дополнительную информацию к выходу в качестве префикса. Однако fprintf регистрирует только то, что вы передаете в качестве параметра. Также fprintf не печатает \ n сам по себе. –

Смежные вопросы