2009-01-06 13 views
13

Estoy examinando la viabilidad de transferir un control existente de Windows MFC a OS X/Carbon. Mi banco de pruebas es una aplicación C++ Carbon generada con el asistente XCode 3.OS X equivalente a OutputDebugString()?

Estoy buscando una manera rápida de descargar información de seguimiento al depurador o al equivalente de OS X de DbgView. En Win32 usaría OutputDebugString(): ¿cuál es el problema en OS X? ¿Hay alguna manera de ver la prueba escrita en std :: cout desde una aplicación de Carbon?

Gracias

Jerry

Respuesta

18

No hay un equivalente real. Xcode utiliza GDB bajo el capó, por lo que básicamente está lidiando con 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 proteger aún más esto envolviéndolo en directivas de preprocesador como una macro y compilarlo (o en una función nil en línea) si NDEBUG está presente en tiempo de 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); 
} 

} 
+0

Jason - Se me olvidó decir gracias por esto. Gracias, es exactamente lo que necesitaba. Todo lo que tenía que hacer era encontrar el .h correcto para #incluir :) –

+0

También es importante tener en cuenta la advertencia al final: http://developer.apple.com/library/mac/#qa/qa1361/_index.html –

+2

Es un poco mejor escribir en stderr que en stdout, para que no quede almacenado. – JWWalker

1

En Xcode se puede ver la salida del std::cout/std::cerr en la ventana de "consola" (Run-> Consola).

También hay Console.app (en/Aplicaciones/Utilidades) que registra todos los resultados escritos en std::cerr desde aplicaciones GUI.

4

Es posible que desee consultar syslog ya que es el método de diagnóstico de facto en los sistemas basados ​​en 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(); 

Google syslog para más información. También deberá twiddle algunos bits en syslog.conf para dirigir la salida a un registro o consola. Luego puede ver el resultado en una ventana de terminal o usando la aplicación de consola.

13

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

Dicho esto, hay varias maneras de hacer el registro de:

  1. NSLog

    Ésta es una función de cacao, pero se puede utilizar en aplicaciones de carbono, también. Enlace contra el marco de Foundation, pero no incluya el encabezado. Declarar usted mismo:

    int NSLog(CFStringRef format, ...); 
    

    pasará por un RFCTA literal como el formato:

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

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

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

    la C vieja recursos seguros biblioteca estándar. #include <stdio.h> para obtenerlos.No importa mucho en una aplicación GUI, pero debería utilizar para la limpieza stderr: fprintf(stderr, "Count: %u\n", count);

  3. syslog

    Sobre tan antigua como f printf, supongo, pero más potente?. Este es un sistema de registro real, no solo escribiendo en un archivo. Puede especificar cosas como la prioridad, lo que le permite suprimir los mensajes de registro de depuración en los sistemas de los verificadores beta mientras aún puede leerlos en su propio sistema. (Notas de final no debe contener código de registro en absoluto.)

  4. asl_log

    parte del sistema de Apple Logger, la sustitución más general de Apple para syslog. Tengo a series of posts about ASL en mi blog.

+0

+1 para fprintf (stderr, "barra foo"); funciona incluso en un plugin QuickTime. p.ej. http://stackoverflow.com/questions/7104314/mac-quicktime-component-debugging –