c++ macos cross-platform carbon

c++ - OS X equivalente a OutputDebugString()?



macos cross-platform (4)

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

Estoy buscando una forma rápida de descargar información de rastreo 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

alemán


En Xcode puede ver el resultado de std::cout / std::cerr en la ventana "consola" (Ejecutar-> Consola).

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


Es posible que desee buscar en 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();

Syslog de Google 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.


No hay un equivalente real. Xcode utiliza GDB bajo el capó, por lo que básicamente estás tratando 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); } }


En primer lugar, Carbon 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:

  1. NSLog

    Esta es una función de Cocoa, pero también puedes usarla en aplicaciones de Carbon. Enlace contra el marco de Foundation, pero no incluya el encabezado. Declararlo 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 listas 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 vieja biblioteca estándar de C está en espera. #include <stdio.h> para obtenerlos. No importa mucho en una aplicación GUI, pero debe usar stderr para limpieza: fprintf(stderr, "Count: %u/n", count);

  3. syslog

    Casi tan viejo como f? Printf, supongo, 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 los mensajes de registro de depuración en los sistemas de los verificadores beta 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.