Pregunta

Estoy estudiando la viabilidad de migración de una existente de Windows control MFC OS X/Carbono.Mi banco de pruebas es un C++ de Carbono generado por la aplicación utilizando el XCode 3 Asistente.

Estoy buscando una forma rápida de volcado de algún rastro de información para el depurador o el OS X equivalente de DbgView.En Win32 yo uso la OutputDebugString () - ¿cuál es el problema en OS X?Es allí una manera a la vista de la prueba escrita a std::cout de Carbono de la aplicación?

Gracias

Jerry

¿Fue útil?

Solución

No hay un equivalente real. Xcode usa GDB debajo del capó, por lo que básicamente se trata de eso. Sin embargo, podría implementarlo usted mismo. El siguiente ejemplo de código producirá salida a salida estándar solo cuando el depurador esté presente. Puede protegerlo aún más envolviéndolo en directivas de preprocesador como una macro y compilándolo (o en una función nula en línea) si NDEBUG está presente en el momento de la compilación. Cualquier salida producida por una aplicación se dirigirá a la consola de depuración en 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);
}

}

Otros consejos

Primero, el carbono no está y no estará disponible en 64 bits. Si Apple alguna vez deja Mac OS X de 32 bits (que es seguro asumir que sucederá tarde o temprano), su aplicación no se ejecutará. Usa cacao.

Dicho esto, hay varias formas de iniciar sesión:

  1. NSLog

    Esta es una función de Cocoa, pero también puede usarla en aplicaciones de Carbon. Enlace contra el marco de la Fundación, pero no incluya el encabezado. Declarelo usted mismo:

    int NSLog(CFStringRef format, ...);
    

    Pasará un literal CFSTR como formato:

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

    La ventaja de NSLog es que puede imprimir objetos de lista de propiedades de CF (cadenas, objetos de datos, fechas, números, matrices y diccionarios) utilizando el formateador% @. Por ejemplo:

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

    La antigua biblioteca estándar de C en espera. #include <stdio.h> para conseguirlos. No importa mucho en una aplicación GUI, pero debe usar stderr para limpieza: fprintf(stderr, "Count: %u\n", count);

  3. syslog

    Supongo que tan viejo como f? printf, pero más poderoso. Este es un sistema de registro real, no solo escribir en un archivo. Puede especificar cosas como la prioridad, lo que le permite suprimir sus mensajes de registro de depuración en los sistemas de beta testers mientras aún puede leerlos en su propio sistema. (Las versiones finales no deben contener ningún código de registro).

  4. asl_log

    Parte de Apple System Logger, el reemplazo más general de Apple para syslog. Tengo una serie de publicaciones sobre ASL en mi blog.

Es posible que desee buscar en syslog ya que de facto es el método de diagnóstico en los sistemas basados en UNIX.Algo así 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();

Google syslog para obtener más información.Usted también tendrá a juguetear con algunos bits syslog.conf para dirigir la salida a un registro o de la consola.A continuación, puede ver el resultado en una ventana de terminal o mediante la aplicación de Consola.

En Xcode puede ver la salida de std::cout / std::cerr en " console " ventana (Ejecutar - > Console).

También hay Console.app (en / Aplicaciones / Utilidades) que registra todos los resultados escritos en <=> desde las aplicaciones GUI.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top