2012-01-19 37 views
8

Trong tổ chức XCode, Bảng điều khiển - Tôi có thể đọc đầu ra NSLog, nhưng không phải printf(). Điều này có thể đọc kết quả printf() trên thiết bị thực, giống như trong trình mô phỏng không?Gỡ lỗi iPhone thiết bị thực

+0

Nó có thể giúp bạn giải thích tại sao bạn muốn làm điều này? Tại sao bạn cần sử dụng printf thay vì NSLog()? Có phải vì bạn đang sử dụng thư viện có chứa các câu lệnh printf() không? –

+2

Bởi vì phần lớn nhất của mã của tôi là mã C. Một phổ biến, chạy dưới windoz, droid, symbian, iOS vv Và printf() làm việc dưới trình mô phỏng iOS, trong XCode. – theWalker

Trả lời

17

giải pháp dễ nhất sẽ được quá tải chức năng printf trên toàn cầu trong dự án của bạn và thay thế nó với sản lượng 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ảm ơn rất nhiều. Giải pháp này hoạt động hoàn hảo và tôi có thể để lại tất cả mã C mà không có bất kỳ thay đổi nào :) – theWalker

+0

@skippy: Điều này có nên được đánh dấu là câu trả lời đúng không? – newenglander

+2

chúng ta nên đặt đoạn mã này vào đâu? – Raptor

-1

Skippy, printf() là câu lệnh đầu ra cho c không cho Objective C, SO trong thiết bị thực cũng printf() không hoạt động.

+0

Mục tiêu-C là bộ siêu C nghiêm ngặt, vì vậy printf() rất nhiều công trình như được ghi chép. Nhưng NSLog() đằng sau hậu trường có nhiều hơn printf(), đó có thể là lý do tại sao Skippy gặp rắc rối. –

+0

Tôi tin rằng vấn đề thực sự là printf in để stdout, trong khi NSLog in để stderr. –

+2

Nick, fprintf (stderr, format, args); không hoạt động trong Bảng điều khiển của tổ chức XCode. – theWalker

4

Bạn có thể chạy lệnh sau để chỉ in ra console của thiết bị:

syslog(LOG_WARNING, "log string"); 

Bạn cũng sẽ cần phải #include <sys/syslog.h> cho syslog và LOG_WARNING để được khai báo rõ ràng

+0

Bạn có thể sử dụng mã nhật ký chuẩn mà không khai báo rõ ràng Tôi nghĩ rằng – wxs

+0

Có, như tôi đã nói, syslog và LOG_WARNING được khai báo rõ ràng trong sys/syslog.h (tên của bao gồm không hiển thị do sử dụng sai < and >) –

+0

Bật iOS 10 stdout đang được gửi tới Xcode, do đó không cần nhật ký hệ thống nữa. –

8

Là Nick Lockwood cho biết trong một trong những ý kiến ​​trên, printf in để stdout nhưng NSLog in để stderr. Bạn có thể sử dụng fprintf để in thành stderr (bảng điều khiển Xcode) thay vì sử dụng printf, như sau:

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

đơn giản và hoạt động với obj-C++;) –

+0

có vẻ như nó không hoạt động trong c + + cho iOS – Sergei

+0

@Sergei hoạt động cho tôi ngay bây giờ, trên XCode 9.2. Lưu ý rằng NSLog thêm một số thông tin bổ sung vào đầu ra làm tiền tố. Tuy nhiên fprintf chỉ ghi lại những gì bạn vượt qua như một tham số. Ngoài ra fprintf không tự in một \ n. –

Các vấn đề liên quan