سؤال

أقوم بدراسة جدوى نقل عنصر تحكم Windows MFC موجود إلى OS X/Carbon.سرير الاختبار الخاص بي هو تطبيق C++ Carbon تم إنشاؤه باستخدام معالج XCode 3.

أنا أبحث عن طريقة سريعة لتفريغ بعض معلومات التتبع إلى مصحح الأخطاء أو ما يعادل DbgView في OS X.في Win32 سأستخدم OutputDebugString() - ما هي الصفقة على OS X؟هل هناك طريقة لعرض الاختبار المكتوب على std::cout من تطبيق Carbon؟

شكرًا

جيري

هل كانت مفيدة؟

المحلول

وليس هناك ما يعادل الحقيقي. يستخدم كسكودي GDB تحت غطاء محرك السيارة، لذلك كنت تتعامل أساسا مع ذلك. هل يمكن، مع ذلك، وتنفيذ ذلك بنفسك. فإن نموذج التعليمات البرمجية أدناه ينتج الإخراج إلى معيار بها إلا عندما المصحح موجودا. هل يمكن زيادة حماية هذه الاشارات في توجيهات المعالج كما ماكرو وتجميع بها (أو إلى وظيفة لا شيء مضمنة) إذا NDEBUG موجودا في وقت الترجمة. سيتم توجيه أي إخراج تنتجها تطبيق إلى وحدة التحكم التصحيح في كسكودي.

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);
}

}

نصائح أخرى

أولاً، الكربون ليس ولن يكون متاحًا في 64 بت.إذا أسقطت Apple نظام التشغيل Mac OS X 32 بت (وهو ما يمكن افتراض حدوثه عاجلاً أم آجلاً)، فلن يتم تشغيل تطبيقك.استخدمي الكاكاو.

ومع ذلك، هناك عدة طرق للقيام بالتسجيل:

  1. NSLog

    هذه وظيفة Cocoa، ولكن يمكنك استخدامها في تطبيقات Carbon أيضًا.قم بالارتباط بالإطار الأساسي، ولكن لا تقم بتضمين الرأس.أعلن ذلك بنفسك:

    int NSLog(CFStringRef format, ...);
    

    ستقوم بتمرير حرف CFSTR بالتنسيق:

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

    ميزة NSLog هي أنه يمكنك طباعة كائنات قائمة خصائص CF (السلاسل، وكائنات البيانات، والتواريخ، والأرقام، والمصفوفات، والقواميس) باستخدام المنسق %@.على سبيل المثال:

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

    مكتبة C القياسية القديمة الاحتياطية. #include <stdio.h> كى تحصل عليهم.لا يهم كثيرًا في تطبيق واجهة المستخدم الرسومية، ولكن يجب عليك استخدام stderr للنظافة: fprintf(stderr, "Count: %u\n", count);

  3. سجل النظام

    أعتقد أنه قديم قدم f?printf، ولكنه أكثر قوة.هذا هو الفعلي نظام التسجيل, ، وليس مجرد الكتابة إلى ملف.يمكنك تحديد أشياء مثل الأولوية، مما يسمح لك بمنع رسائل سجل التصحيح الخاصة بك على أنظمة مختبري النسخة التجريبية بينما تظل قادرًا على قراءتها على نظامك الخاص.(يجب ألا تحتوي الإصدارات النهائية على رمز التسجيل على الإطلاق.)

  4. asl_log

    جزء من Apple System Logger، وهو بديل Apple الأكثر عمومية لسجل النظام.أملك سلسلة من المشاركات حول ASL على مدونتي.

وقد ترغب في النظر في syslog لأنه هو في الواقع طريقة التشخيص على الأنظمة المستندة إلى UNIX. شيء من هذا القبيل:

#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.conf لتوجيه الإخراج إلى سجل أو وحدة التحكم. ثم يمكنك عرض الإخراج في إطار المحطة الطرفية أو باستخدام تطبيق وحدة التحكم.

في كسكودي يمكنك ان ترى إخراج std::cout / std::cerr في "وحدة التحكم" نافذة (انتخابات الاعادة> وحدة التحكم).

وهناك أيضا Console.app (في / تطبيقات / المرافق) الذي يسجل كافة الإخراج خطية إلى std::cerr من تطبيقات واجهة المستخدم الرسومية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top