2009-01-06 45 views
13

Tôi đang kiểm tra tính khả thi của việc chuyển một điều khiển Windows MFC hiện có sang OS X/Carbon. Giường thử nghiệm của tôi là ứng dụng C++ Carbon được tạo bằng Trình hướng dẫn XCode 3.OS X tương đương với OutputDebugString()?

Tôi đang tìm một cách nhanh chóng để kết xuất một số thông tin dấu vết cho trình gỡ lỗi hoặc OS X tương đương với DbgView. Trên Win32 tôi muốn sử dụng OutputDebugString() - thỏa thuận trên OS X là gì? Có cách nào để xem thử nghiệm bằng văn bản để std :: cout từ một ứng dụng Carbon?

Cảm ơn

Jerry

Trả lời

18

Không có thực tương đương. Xcode sử dụng GDB dưới mui xe, vì vậy bạn về cơ bản phải đối phó với điều đó. Bạn có thể, tuy nhiên, thực hiện nó cho mình. Mẫu mã dưới đây sẽ tạo ra kết quả đầu ra tiêu chuẩn chỉ khi trình gỡ rối có mặt. Bạn có thể bảo vệ hơn nữa điều này bằng cách gói nó trong các chỉ thị tiền xử lý như một macro và biên dịch nó ra (hoặc thành một hàm nil nội dòng) nếu NDEBUG có mặt tại thời gian biên dịch. Bất kỳ đầu ra nào được tạo ra bởi một ứng dụng sẽ được chuyển đến bàn điều khiển gỡ lỗi trong Xcode.

extern "C" { 

bool IsDebuggerPresent() { 
    int mib[4]; 
    struct kinfo_proc info; 
    size_t size; 

    info.kp_proc.p_flag = 0; 
    mib[0] = CTL_KERN; 
    mib[1] = KERN_PROC; 
    mib[2] = KERN_PROC_PID; 
    mib[3] = getpid(); 

    size = sizeof(info); 
    sysctl(mib, sizeof(mib)/sizeof(*mib), &info, &size, NULL, 0); 

    return ((info.kp_proc.p_flag & P_TRACED) != 0); 
} 

void OutputDebugString(const char *restrict fmt, ...) { 
    if(!IsDebuggerPresent()) 
     return; 

    va_list args; 
    va_start(args, fmt); 
    vprintf(fmt, args); 
    va_end(args); 
} 

} 
+0

Jason - Tôi quên nói lời cảm ơn vì điều này. Cảm ơn bạn, đó là chính xác những gì tôi cần. Tất cả những gì tôi phải làm là tìm đúng .h để #include :) –

+0

Cũng quan trọng cần lưu ý cảnh báo ở cuối: http://developer.apple.com/library/mac/#qa/qa1361/_index.html –

+2

Nó tốt hơn một chút để viết cho stderr hơn là stdout, để nó sẽ không được đệm. – JWWalker

1

Trong Xcode bạn sẽ nhìn thấy đầu ra của std::cout/std::cerr trong cửa sổ "console" (Run-> Console).

Ngoài ra còn có Console.app (trong/Applications/Utilities) ghi nhật ký tất cả đầu ra được ghi vào std::cerr từ các ứng dụng GUI.

4

Bạn có thể muốn xem xét syslog vì đây là phương pháp chẩn đoán thực tế trên các hệ thống dựa trên UNIX. Một cái gì đó như:

#include <syslog.h> 

/* Do this early on in your program like at the beginning of main() */ 
openlog("MYPROGRAM", 0, LOG_USER); 

/* Use this to log something */ 
syslog(LOG_DEBUG, "%s %s", "Hello", "World"); 

/* Do this somewhere before you exit if you being are pedantic */ 
closelog(); 

Google syslog để biết thêm thông tin. Bạn cũng sẽ phải viết một số bit trong syslog.conf để chuyển đầu ra tới nhật ký hoặc bảng điều khiển. Sau đó, bạn có thể xem đầu ra trong cửa sổ đầu cuối hoặc sử dụng ứng dụng Console.

13

Trước hết, Carbon không có và sẽ không khả dụng trong 64 bit. Nếu Apple từng giảm 32-bit Mac OS X (mà nó an toàn để giả định sẽ xảy ra sớm hay muộn), ứng dụng của bạn sẽ không chạy. Sử dụng ca cao.

Điều đó nói rằng, có một số cách để làm điều logging:

  1. NSLog

    Đây là một chức năng Cocoa, nhưng bạn có thể sử dụng nó trong các ứng dụng Carbon, quá. Liên kết với khung nền tảng, nhưng không bao gồm tiêu đề. Khai báo nó tự hỏi:

    int NSLog(CFStringRef format, ...); 
    

    Bạn sẽ vượt qua một CFSTR đen như là định dạng:

    NSLog(CFSTR("Count: %u"), count); 
    

    Ưu điểm của NSLog là bạn có thể in CF đối tượng sở hữu-list (chuỗi, các đối tượng dữ liệu, ngày tháng , số, mảng và từ điển) bằng cách sử dụng trình định dạng% @. Ví dụ:

    CFArrayRef array = /*...*/; 
    NSLog(CFSTR("Array: %@"), array); 
    
  2. printf/fprintf

    C dự phòng thư viện tiêu chuẩn cũ. #include <stdio.h> để nhận chúng.Nó không quan trọng nhiều trong một ứng dụng GUI, nhưng bạn nên sử dụng stderr cho sạch sẽ: fprintf(stderr, "Count: %u\n", count);

  3. syslog

    Về như cũ printf như f, tôi đoán, nhưng mạnh mẽ hơn?. Đây là hệ thống ghi nhật ký thực tế , không chỉ ghi vào một tệp. Bạn có thể chỉ định những thứ như ưu tiên, cho phép bạn chặn thông báo nhật ký gỡ lỗi của mình trên hệ thống của người thử nghiệm beta trong khi vẫn có thể đọc chúng trên hệ thống của riêng bạn. (Phiên bản cuối cùng không nên chứa mã khai thác gỗ ở tất cả.)

  4. asl_log

    Phần của Apple Hệ thống Logger, thay thế tổng quát hơn của Apple cho syslog. Tôi có a series of posts about ASL trên blog của mình.

+0

+1 cho fprintf (stderr, "foo bar"); hoạt động ngay cả trong plugin QuickTime. ví dụ. http://stackoverflow.com/questions/7104314/mac-quicktime-component-debugging –

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