2009-02-17 24 views
55

Tôi đã quen với việc lập trình và có thể xem được các thông điệp tường trình. Tôi biết bạn đã sử dụng để có thể sử dụng NSLog() để theo dõi các thư khi gỡ lỗi các ứng dụng Cocoa. Cách tốt nhất để "theo dõi" thư khi mã hóa trong môi trường phát triển iPhone Xcode là gì?Làm cách nào để gỡ lỗi với NSLog (@ "Bên trong Trình mô phỏng iPhone")?

+0

iCode4Humans cung cấp hướng dẫn tốt về tùy chỉnh NSLog (nếu nó trợ giúp): http://icode4humans.com/nslog-some-examples/ – devvmiller

Trả lời

5

Trong dự án của tôi, tôi có giải pháp tùy chỉnh dựa trên DebugOutput.m Điều này sẽ thêm số dòng & vào đầu ra gỡ lỗi, giúp dễ dàng xác định vị trí của văn bản đầu ra, trong khi vẫn giữ ngắn gọn.

Tôi đã tăng cường giải pháp chuẩn với mặt nạ gỡ lỗi để tôi có thể bật và tắt gỡ lỗi cho các khu vực chức năng cụ thể trong ứng dụng của mình. Trong Debug.h, tôi có

typedef enum { 
kDebugMaskAp- = 1, 
kDebugMaskXMLParser = 1 << 1, 
kDebugMaskNetwork = 1 << 2, 
kDebugMaskAnalytics = 1 << 3, 
kDebugMaskCache = 1 << 4, 
} debugBitMask; 

#define debugForComponent(mask,format,...) if(currentDebugMask() & mask) [[DebugOutput sharedDebug] output:__FILE__ lineNumber:__LINE__ input:(format), ##__VA_ARGS__] 

Và trong Debug.m

-(void)output:(char*)fileName lineNumber:(int)lineNumber input:(NSString*)input, ... 
{ 
    va_list argList; 
    NSString *filePath, *formatStr; 

    // Build the path string 
    filePath = [[NSString alloc] initWithBytes:fileName length:strlen(fileName) encoding:NSUTF8StringEncoding]; 

    // Process arguments, resulting in a format string 
    va_start(argList, input); 
    formatStr = [[NSString alloc] initWithFormat:input arguments:argList]; 
    va_end(argList); 

    // Call NSLog, prepending the filename and line number 
    NSLog(@"File:%s Line:%d %@",[((DEBUG_SHOW_FULLPATH) ? filePath : [filePath lastPathComponent]) UTF8String], lineNumber, formatStr); 

    [filePath release]; 
    [formatStr release]; 
} 

Trong ứng dụng, gọi điện giống như thế này:

debugForComponent(kDebugMaskApp,@"Request failed - error %@", [error localizedDescription]); 
213

Có một cách xa thuận tiện hơn để theo dõi với các thông điệp tường trình trong Xcode, và đó là sử dụng các hành động Breakpoint.

Trên dòng mã bạn muốn thêm printf hoặc NSLog, đặt điểm ngắt, sau đó bấm điều khiển và chọn "Chỉnh sửa điểm dừng". Trong bong bóng màu xanh xuất hiện, hãy nhấp vào nút + ở bên phải để mở Hành động Breakpoint: alt text http://idisk.mac.com/cdespinosa/Public/Breakpoint%20Actions.png

Nhập văn bản nhật ký của bạn ở đó. Bất kỳ biểu thức nào có thể được in trong Trình gỡ lỗi có thể được sử dụng khi được phân tách bằng dấu @.

Để gỡ lỗi Mục tiêu-C thường hữu ích hơn khi chọn "Trình gỡ lỗi" từ cửa sổ bật lên và nhập 'po [[phương pháp đối tượng]]' để in chuỗi mô tả của đối tượng Objective-C hoặc kết quả của gọi phương thức.

Đảm bảo nhấp vào hộp kiểm "Tiếp tục" ở trên cùng bên phải để tiếp tục thực hiện sau nhật ký.

Ưu điểm của việc này qua NSLog và printf:

  • Đó là một cách nhanh chóng. Bạn không cần phải biên dịch lại và khởi động lại để thêm hoặc chỉnh sửa thông báo tường trình. Điều này giúp bạn tiết kiệm rất nhiều thời gian .
  • Bạn có thể bật có chọn lọc và tắt chúng. Nếu bạn học đủ số từ một, nhưng spew của nó là can thiệp, chỉ cần bỏ chọn hộp Enabled Enabled của nó.
  • Tất cả đầu ra được tạo trên máy tính Mac của bạn, không bao giờ trên iPhone, vì vậy bạn không phải tải xuống và phân tích cú pháp thông qua nhật ký sau khi thực tế.
  • Cơ hội của bảng điều khiển giao hàng spew trong đơn đăng ký của bạn đáng kể là bị giảm.

Ngoài ra, hãy kiểm tra nút Nói; thật tuyệt vời khi gỡ lỗi các ứng dụng toàn màn hình nơi bạn không thể thấy nhật ký gỡ lỗi.

+3

Cho anh ta một Dân túy cho người này! – fbrereto

+27

Có một lợi thế nữa, theo ý kiến ​​của tôi, là tốt nhất của tất cả: Khi phát triển trong một nhóm (sử dụng SCM), tôi ghét có giao diện điều khiển lộn xộn với đầu ra gỡ lỗi của các nhà phát triển khác. Sử dụng phương thức của bạn, đầu ra gỡ lỗi không được cam kết với mã nguồn hoặc dự án và sẽ chỉ được nhìn thấy trên máy cục bộ nơi nó được tạo. –

+0

Yêu thích nó. @Nikolai, đã đồng ý, nhưng cũng có một nơi thích hợp để đăng nhập bình thường. Phương pháp này không nên loại trừ việc đăng nhập chính xác tại các điểm bị lỗi nghiêm trọng. Bạn đang phải mặc dù, tôi nghĩ rằng hầu hết các devs over-log và tạo lộn xộn. – DougW

-2

Tôi chỉ cần sử dụng chức năng thay thế tất cả ....

tôi vô hiệu hóa tất cả các báo cáo NSLog của tôi bằng cách thay thế NSLog (@ "với // *** NSLog (@"

Bằng cách đó tôi có thể chỉ đơn giản thấy nó (sử dụng tìm trong tất cả các file dự án) với // *** NSLog (@" và kích hoạt lại chúng

Không có gì lạ mắt nhưng nó hoạt động :)

+0

Một mẹo nhỏ cho người dùng tìm kiếm nút Thay thế tất cả: Không có nút Thay thế tất cả trong cửa sổ Tìm trong dự án, đó là vì khi không có kết quả nào được chọn, nút Replace sẽ thay thế tất cả. – ustun

+1

Đây là một chút nguy hiểm khi sử dụng Kiểm soát Phiên bản ...! – JBRWilkinson

+0

Đây không phải là một ý tưởng hay. Quá dễ quên hoặc sai. Và nó phụ thuộc vào nhà phát triển nhận được nó đúng mọi lúc, chưa kể đó là một nhiệm vụ thủ công. Tùy chọn tốt nhất là sử dụng các định nghĩa như đã đề cập trong câu trả lời khác. – drekka

9

Dưới đây là một chút lớn mã tôi nhặt ở đâu đó Nó định nghĩa các hàm mới DLog() và ALog(). Các thông điệp DLog chỉ xuất hiện khi ứng dụng được biên dịch với cờ -DDEBUG (xác định DEBUG). Thông báo ALOG luôn xuất hiện (ngay cả trong chế độ Phát hành).

// DLog is almost a drop-in replacement for NSLog 
// DLog(); 
// DLog(@"here"); 
// DLog(@"value: %d", x); 
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable); 
#ifdef DEBUG 
#  define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); 
#else 
#  define DLog(...) 
#endif 

// ALog always displays output regardless of the DEBUG setting 
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); 
+0

Tôi đã sử dụng điều này trong quá khứ và nó làm việc tốt cho tôi vào thời điểm đó ... Bạn chỉ cần đảm bảo rằng bạn có "cờ C khác" được định nghĩa cho "-DDEBUG", "-DRELEASE", v.v. –

+0

Có nhiều mã ví dụ xung quanh bằng cách sử dụng định nghĩa như thế này. Lợi thế để làm như vậy là với một thiết lập tiền xử lý đơn giản trong xây dựng gỡ lỗi của bạn, bạn có thể có một dấu vết toàn bộ mã của bạn xuất hiện trong nhật ký. – drekka

2

Dán mã này vào tiêu đề tiền tố của bạn. TẤT CẢ các bản ghi từ dự án sẽ biến mất chắc chắn.

#ifndef __OPTIMIZE__ 

# define NSLog(...) NSLog(__VA_ARGS__) 

#else 

# define NSLog(...) {} 

#endif 
0

Bạn có thể sử dụng NSLogger mang lại nhiều điều để bàn hơn là chỉ đăng nhập tin nhắn của bạn. Tôi sử dụng các macro để vô hiệu hóa các bản ghi trong bản phát hành bản phát hành, đồng thời để lại mọi bản ghi trong số chúng hoạt động trong các bản dựng gỡ lỗi. Khối lượng nhật ký không phải là vấn đề, vì NSLogger cung cấp các tùy chọn lọc nhật ký mạnh mẽ.

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