OS X equivalente a OutputDebugString ()?
-
03-07-2019 - |
Pergunta
Estou a analisar a viabilidade de portar um controle do Windows MFC existente para OS X / carbono. Meu de ensaio é uma aplicação C ++ carbono gerado usando o Assistente 3 XCode.
Eu estou procurando uma maneira rápida para despejar algumas informações de rastreamento para o depurador ou o equivalente OS X de DbgView. Em Win32 eu usaria OutputDebugString () - que é o negócio no OS X? Existe uma maneira de teste de vista por escrito para std :: cout a partir de um aplicativo de carbono?
Graças
Jerry
Solução
Não há equivalente real. Xcode usa GDB sob o capô, para que você está lidando basicamente com isso. Você poderia, no entanto, implementá-lo. A amostra de código abaixo irá produzir uma saída para fora padrão somente quando o depurador está presente. Você pode proteger ainda mais este por envolvê-lo em directivas de pré-processador como uma macro e compilá-lo para fora (ou em uma função nula em linha) se NDEBUG está presente em tempo de compilação. Qualquer saída produzida por uma aplicação será direcionado para o console de depuração no 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);
}
}
Outras dicas
Primeiro, Carbon não é e não estará disponível em 64-bit. Se a Apple sempre cai 32-bit Mac OS X (que é seguro assumir que vai acontecer mais cedo ou mais tarde), o aplicativo não será executado. Use Cacau.
Dito isto, há várias maneiras de fazer o log:
-
NSLog
Esta é uma função de cacau, mas você pode usá-lo em aplicativos de carbono, também. Fazer a ligação contra o framework Foundation, mas não incluem o cabeçalho. Declare-se:
int NSLog(CFStringRef format, ...);
Você vai passar um literal CFSTR como o formato:
NSLog(CFSTR("Count: %u"), count);
A vantagem de NSLog é que você pode imprimir objetos CF-lista de propriedades (cordas, objetos de dados, datas, números, arrays e dicionários) usando o% @ formatador. Por exemplo:
CFArrayRef array = /*...*/; NSLog(CFSTR("Array: %@"), array);
-
printf / fprintf
O velho C esperas biblioteca padrão.
#include <stdio.h>
para obtê-los. Ele não importa muito em um aplicativo GUI, mas você deve usar stderr para limpeza:fprintf(stderr, "Count: %u\n", count);
-
syslog
Sobre a tão antiga quanto f? Printf, eu acho, mas mais poderoso. Este é um real login do sistema , não apenas escrevendo para um arquivo. Você pode especificar coisas como prioridade, o que lhe permite suprimir suas mensagens de log de depuração nos sistemas dos testadores beta e ainda ser capaz de lê-los em seu próprio sistema. (Versões finais não deve conter o registo de código em tudo.)
-
asl_log
Parte da Apple System Logger, substituição mais geral da Apple para o syslog. Eu tenho uma série de posts sobre ASL no meu blog.
Você pode querer olhar para syslog
já que é o método de diagnóstico de facto em sistemas baseados em UNIX. Algo como:
#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();
O Google syslog para mais informações. Você também terá que mexer alguns bits em syslog.conf
para direcionar a saída para um log ou console. Então você pode ver a saída em uma janela de terminal ou usando o aplicativo Console.
No Xcode você pode ver a saída do std::cout
/ std::cerr
na janela "console" (Run-> Console).
Há também Console.app (em / Aplicativos / Utilitários) que registra todas as saídas escritas para std::cerr
de aplicações GUI.