Вопрос

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

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

Спасибо

Джерри

Это было полезно?

Решение

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

}

Другие советы

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

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

  1. NSLog - журнал

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

    int NSLog(CFStringRef format, ...);
    

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top