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

14
задан Peter Hosey 7 January 2009 в 04:37
поделиться

4 ответа

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

}
19
ответ дан 1 December 2019 в 07:20
поделиться

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

Тем не менее существует несколько способов сделать вход:

  1. NSLog

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

    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> для получения их. Это не имеет значения очень в приложении для GUI, но необходимо использовать stderr для чистоты: fprintf(stderr, "Count: %u\n", count);

  3. системный журнал

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

  4. часть asl_log

    Системного Регистратора Apple, более общей замены Apple для системного журнала. Я имею ряд сообщений о ASL на моем блоге.

13
ответ дан 1 December 2019 в 07:20
поделиться

Вы могли бы хотеть изучить 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 для направления вывода к журналу или консоли. Затем можно просмотреть вывод в окне терминала или использовании Консольного приложения.

4
ответ дан 1 December 2019 в 07:20
поделиться

В XCode Вы видите вывод std::cout / std::cerr в "консольном" окне (Выполнение-> Консоль).

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

1
ответ дан 1 December 2019 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: