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.