Вопрос по cross-platform, macos-carbon, c++, macos –  из приложений с графическим интерфейсом.

14

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

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

Спасибо

Джерри

Ваш Ответ

4   ответа
4

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

19

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

}
Джейсон - Я забыл сказать спасибо за это. Спасибо, это именно то, что мне было нужно. Все, что мне нужно было сделать, это найти правильное .h для #include :) G Forty
Чуть лучше писать в stderr, чем в stdout, чтобы он не буферизовался. JWWalker
Также важно отметить предупреждение в конце:developer.apple.com/library/mac/#qa/qa1361/_index.html vine'th
Может ли быть так, что запись в stderr или stdout больше не работает в OSX 10.10, когда приложение запускается через Finder? Я не вижу такого вывода из моего приложения в Console.app в разделе «Все сообщения». Thomas Tempelmann
13

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

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

NSLog

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

int NSLog(CFStringRef format, ...);

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

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

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

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

Printf / fprintf

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

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

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

asl_log

Часть Apple System Logger, более общая замена Apple для системного журнала. я имеюсерия постов про ASL в моем блоге.

+1 для fprintf (stderr, "foo bar"); работает даже в плагине QuickTime. напримерstackoverflow.com/questions/7104314/... Jared Updike
1

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

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

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