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

Foi útil?

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:

  1. 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);
    
  2. 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);

  3. 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.)

  4. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top