Question

J'examine la faisabilité du portage d'un contrôle MFC Windows existant sur OS X / Carbon. Mon banc d'essai est une application Carbon C ++ générée à l'aide de l'assistant XCode 3.

Je cherche un moyen rapide de transférer des informations de trace dans le débogueur ou dans l’équivalent OS X de DbgView. Sur Win32, je voudrais utiliser OutputDebugString () - quel est le problème sur OS X? Existe-t-il un moyen de visualiser le test écrit sur std :: cout depuis une application Carbon?

Merci

Jerry

Était-ce utile?

La solution

Il n’existe pas de véritable équivalent. Xcode utilise GDB sous le capot, vous avez donc essentiellement affaire à cela. Vous pouvez toutefois le mettre en œuvre vous-même. L'exemple de code ci-dessous produira une sortie vers sortie standard uniquement lorsque le débogueur est présent. Vous pouvez mieux protéger cela en l'enveloppant dans les directives du préprocesseur sous forme de macro et en le compilant (ou dans une fonction inline nil) si NDEBUG est présent au moment de la compilation. Toute sortie produite par une application sera dirigée vers la console de débogage sous 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);
}

}

Autres conseils

Tout d’abord, Carbon n’est pas et ne sera pas disponible en 64 bits. Si Apple abandonne un jour Mac OS X 32 bits (ce qui ne risque pas de se produire tôt ou tard), votre application ne fonctionnera pas. Utilisez du cacao.

Cela dit, il existe plusieurs façons de se connecter:

  1. NSLog

    Il s'agit d'une fonction Cocoa, mais vous pouvez également l'utiliser dans les applications Carbon. Lien vers le framework Foundation, mais n'incluez pas l'en-tête. Déclarez-le vous-même:

    int NSLog(CFStringRef format, ...);
    

    Vous passerez un littéral CFSTR au format:

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

    L'avantage de NSLog est que vous pouvez imprimer des objets de liste de propriétés CF (chaînes, objets de données, dates, nombres, tableaux et dictionnaires) à l'aide du formateur% @. Par exemple:

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

    L'ancienne bibliothèque standard C standby. #include <stdio.h> pour les obtenir. Cela n'a pas beaucoup d'importance dans une application graphique, mais vous devez utiliser stderr pour la propreté: fprintf(stderr, "Count: %u\n", count);

  3. syslog

    À peu près aussi vieux que f? printf, je suppose, mais plus puissant. Il s'agit d'un système de journalisation , qui ne consiste pas simplement à écrire dans un fichier. Vous pouvez spécifier des éléments tels que la priorité, ce qui vous permet de supprimer les messages du journal de débogage sur les systèmes des bêta-testeurs tout en permettant de les lire sur votre propre système. (Les versions finales ne devraient pas contenir de code de journalisation.)

  4. asl_log

    Partie de Apple System Logger, le remplacement plus général d’Apple pour syslog. J'ai une série d'articles sur l'ASL sur mon blog.

Vous voudrez peut-être examiner syslog puisqu'il s'agit de la méthode de diagnostic de facto sur les systèmes UNIX. Quelque chose comme:

#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 pour plus d'informations. Vous devrez également tordre quelques bits dans syslog.conf pour diriger la sortie vers un journal ou une console. Vous pouvez ensuite afficher la sortie dans une fenêtre de terminal ou à l'aide de l'application Console.

Dans Xcode, vous pouvez voir la sortie de std::cout / std::cerr dans la & console; & "; fenêtre (Exécuter - > Console).

Il existe également Console.app (dans / Applications / Utilities), qui enregistre toutes les sorties écrites dans <=> à partir d'applications GUI.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top