OS X эквивалентна OutputDebugString()?

Я изучаю возможность переноса существующего элемента управления Windows MFC на OS X/Carbon. Мой тестовый слой - это приложение С++ Carbon, созданное с помощью мастера XCode 3.

Я ищу быстрый способ сбрасывать информацию о трассировке в отладчик или эквивалент OS X DbgView. На Win32 я бы использовал OutputDebugString() - что такое сделка в OS X? Есть ли способ просмотра теста, написанного на std:: cout из приложения Carbon?

Спасибо

Джерри

Ответы

Ответ 1

Нет реального эквивалента. Xcode использует GDB под капотом, поэтому вы в основном имеете дело с этим. Вы могли бы, однако, реализовать его сами. Приведенный ниже пример кода будет выдавать выходной сигнал в стандартную версию только тогда, когда присутствует отладчик. Вы можете еще больше защитить это, обернув его в директоры препроцессора как макрос и скомпилировав его (или встроенную функцию nil), если NDEBUG присутствует во время компиляции. Любой вывод, созданный приложением, будет направлен на консоль отладки в 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);
}

}

Ответ 2

Во-первых, Carbon не доступен и не будет доступен в 64-разрядной версии. Если Apple когда-либо откажется от 32-разрядной Mac OS X (что безопасно предположить, произойдет рано или поздно), ваше приложение не будет работать. Используйте Cocoa.

Тем не менее, существует несколько способов ведения журнала:

  • NSLog

    Это функция Cocoa, но вы также можете использовать ее в приложениях Carbon. Связать с базой Foundation, но не включать заголовок. Объявите это сами:

    int NSLog(CFStringRef format, ...);
    

    Вы передадите литерал CFSTR в качестве формата:

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

    Преимущество NSLog заключается в том, что вы можете печатать объекты списка свойств CF (строки, объекты данных, даты, числа, массивы и словари), используя% @formatter. Например:

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

    Старая библиотека стандартных библиотек C. #include <stdio.h>, чтобы получить их. Это не имеет большого значения в графическом приложении, но вы должны использовать stderr для чистоты: fprintf(stderr, "Count: %u\n", count);

  • Syslog

    Примерно так же старый, как f? printf, но более мощный. Это фактическая система ведения журнала, а не только запись в файл. Вы можете указать такие вещи, как приоритет, позволяя вам подавлять сообщения отладочного журнала в бета-тестерах, сохраняя при этом возможность читать их в своей собственной системе. (Окончательные версии не должны содержать код регистрации вообще.)

  • asl_log

    Часть Apple System Logger, Apple, более общая замена для syslog. У меня серия сообщений об ASL в моем блоге.

Ответ 3

Возможно, вы захотите заглянуть в 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 для получения дополнительной информации. Вам также придется перекрутить несколько бит в syslog.conf, чтобы направлять вывод в журнал или консоль. Затем вы можете просмотреть вывод в окне терминала или с помощью приложения консоли.

Ответ 4

В Xcode вы можете увидеть вывод std::cout/std::cerr в окне консоли (Run- > Console).

Существует также Console.app(in/Applications/Utilities), который регистрирует весь вывод, записанный в std::cerr из приложений GUI.