Frage

Ich bin die Prüfung der Durchführbarkeit der Portierung einer bestehenden Windows-MFC-Steuerelement auf OS X / Kohlenstoff. Mein Testbett ist ein C ++ Carbon-Anwendung erzeugt, um die XCode 3-Assistenten.

Ich bin auf der Suche nach einem schnellen Weg eine Spur Info an den Debugger oder dem OS X-Äquivalent von DbgView dump. Auf Win32 würde ich Output () verwenden - was auf OS X ist der Deal? Gibt es eine Möglichkeit Test zu sehen geschrieben std :: cout aus einer Carbon-app?

Danke

Jerry

War es hilfreich?

Lösung

Es gibt kein wirkliches Äquivalent. Xcode verwendet GDB unter der Haube, so dass Sie im Grunde mit dem zu tun. Sie könnten jedoch implementieren it yourself. Das folgende Codebeispiel wird aus nur ausgegeben erzeugen, wenn die Standard-Debugger vorhanden sind. Sie könnten dies weiter schützen, indem es in Präprozessordirektiven als Makro Einwickeln und kompilieren (oder in eine Inline-Null-Funktion), wenn NDEBUG vorhanden bei der Kompilierung ist. Jede Ausgabe von einer Anwendung erzeugt wird, auf die Debug-Konsole in Xcode gerichtet werden.

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);
}

}

Andere Tipps

Zunächst einmal, Carbon ist nicht und wird nicht in 64-Bit verfügbar sein. Wenn Apple jemals Tropfen 32-Bit Mac OS X (die es ist sicher passieren wird, davon ausgehen, früher oder später), wird Ihre App nicht ausgeführt werden. Verwenden Cocoa.

Das heißt, es gibt mehrere Möglichkeiten, die Protokollierung zu tun:

  1. NSLog

    Dies ist eine Cocoa-Funktion, aber Sie können es in Carbon-Anwendungen, verwenden. Link gegen die Stiftung Rahmen, aber nicht den Header enthalten. Erklären Sie es selbst:

    int NSLog(CFStringRef format, ...);
    

    Sie erhalten eine CFSTR wörtlichen als Format übergeben:

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

    Der Vorteil von NSLog ist, dass Sie CF-Eigenschaft-Liste Objekte drucken können (Strings, Datenobjekte, Daten, Zahlen, Arrays und Wörterbücher) unter Verwendung des% @ Formatierer. Zum Beispiel:

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

    Die alte C-Standardbibliothek standbys. #include <stdio.h> sie zu bekommen. Es spielt keine große Rolle in einer GUI-Anwendung, aber Sie sollten stderr für Sauberkeit verwenden: fprintf(stderr, "Count: %u\n", count);

  3. syslog

    über so alt wie f? Printf, würde ich raten, aber mächtiger. Dies ist ein tatsächliches Logging-System , nicht nur in eine Datei zu schreiben. Sie können Dinge wie Priorität festlegen, so dass Sie Ihre Debug-Log-Meldungen auf Beta-Tester die Systeme zu unterdrücken, während noch in der Lage zu sein, sie auf Ihrem eigenen System zu lesen. (Final Releases sollten überhaupt nicht enthalten Code anzumelden.)

  4. asl_log

    Ein Teil des Apple System Logger, Apples allgemeinere Ersatz für syslog. Ich habe eine Reihe von Beiträgen über ASL auf meinem Blog.

Sie möchten vielleicht in syslog suchen, da sie die De-facto-Diagnoseverfahren auf UNIX-basierten Systemen. So etwas wie:

#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 für weitere Informationen. Sie werden auch einige Bits in syslog.conf twiddle haben, um die Ausgabe in eine Log oder Konsole zu lenken. Dann können Sie die Ausgabe in einem Terminal-Fenster anzuzeigen oder die Konsolenanwendung verwendet wird.

In Xcode können Sie die Ausgabe von std::cout / std::cerr in der "Konsole" Fenster (Run-> Console).

Es gibt auch Console.app (in / Programme / Dienstprogramme), die alle Ausgaben protokolliert geschrieben von GUI-Anwendungen std::cerr.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top