2016-04-20 18 views
-4

Ich verwende einige sehr temporäre Debug-Ausdrucke in verschiedenen Userspace-Programmen, um herauszufinden, welcher Code auf einem eingebetteten Linux-Gerät ausgeführt wird, und ich möchte, dass diese Drucke in eine Datei schreiben, ohne sie offen zu lassen. Um das Debugging portabler zwischen den verschiedenen Programmen zu machen, wäre es schön, einen Einzeiler zu haben, der eine Datei öffnen, schreiben und schließen kann, ohne eine Funktion/Makro anderswo definieren zu müssen. Ich könnte so etwas wie:Einliner für fopen, fprintf, fclose?

{ FILE *f = fopen("filename", "a"); if (f) { fprintf(f, "DEBUG MSG\n"); fclose(f); } else printf("File open error!\n"); } 

, die nur Leerzeichen ist das Entfernen von:

{ 
    FILE *f = fopen("filename", "a"); 
    if (f) { 
     fprintf(f, "DEBUG MSG\n"); 
     fclose(f); 
    } 
    else 
     printf("File open error!\n"); 
} 

Aber das fühlt sich unnötig komplex. Gibt es einen vereinfachten Weg, dies zu tun? Auch hier geht es nicht um eine Funktion, da ich es gerne zwischen verschiedenen Programmen kopieren/einfügen würde, ohne jedes Mal eine Funktion zu definieren. Es ist nur ein temporäres printk-Äquivalent für den Benutzerbereich.

+12

Normalerweise werden diese Einzeiler Funktionen genannt ... – squiguy

+0

Eine Zeile wie in 'im Quellcode'? Am besten machen Sie es zu einem Makro, so dass Sie es später leicht deaktivieren können. – usr2564301

+0

Sicher: Legen Sie den Logging - Kram in ein separates Modul, rufen Sie die "open" -Funktion des Moduls früh von 'main',' close' kurz bevor Sie Ihr Programm beenden und die 'log' - Funktion wo immer Sie schreiben wollen Logdatei. – Olaf

Antwort

0

Wie von Mark Plotnick erwähnt, ist eine Abhilfe für Linux-Systeme:

system("echo DEBUG MSG >> filename"); 

Es ist nicht schön ist, aber es ist schnell, Kopie/pasteable und einfach für diese Situation zu verwenden, da es auch schreiben kann zu /dev/kmsg:

system("echo DEBUG MSG >> /dev/kmsg"); 

, die es wie ein printk verhalten können.Natürlich ist es keine sichere Lösung und kann nicht mit irgendwelchen Zeichen verwendet werden, die ein Bash-Echo stören, aber für eine temporäre statische Debug-Nachricht funktioniert es gut.

+1

Hinweis: Dies ist eine betriebssystemspezifische Lösung. Der Post gab das Betriebssystem nicht an und hatte "läuft auf einem eingebetteten Gerät" was bedeutet, dass es nicht einmal ein zugrunde liegendes Betriebssystem gibt. – chux

+0

Guter Punkt. Ich habe das zur Frage hinzugefügt. Ich hoffte auf eine allgemeinere Lösung (wie eine Bibliotheksfunktion, von der ich nichts gewusst hatte oder so), aber diese Lösung löste das Problem für meine Situation. – vestlen

5

Functions.


Extra-Zeichen für meine kürzeste Antwort.

1

mögliches Problem mit fprintf(f, "DEBUG MSG\n");

Ich gehe davon aus "DEBUG MSG\n" ist einige Platzhalter für die wahre Botschaft. Sollte die wahre Nachricht eine '%' enthalten, sucht die Funktion nach fehlenden Argumenten. Verwenden Sie fputs() - es kann auf der CPU auch leichter als fprintf() sein.

fputs(debug_message, f); 

Die wahre Botschaft ein '\n' fehlen kann und dann kurz vor einem Programmabsturz in Pufferung stecken. Am besten, wenn du fertig bist.

fputs(debug_message, f); 
fflush(f); 

Pedantisch: Debuggen ist für die Problemlösung. Zu oft ist die Nachricht selbst fraglich/korrupt. Erwägen Sie, Schutz zu verwenden. (Ich traue nicht zu lange Debug-Nachrichten). Natürlich, je mehr Müll in der fprintf(), desto größer ist die Performance-Auswirkungen der Debug-Protokollierung.

if (f) { 
    if (debug_message) { 
    fprintf(f, "%.99s", debug_message); 
    fflush(f); 
    fclose(f); 
    } 
} 

Wie @Tom Karzes erwähnt, als stdout Diagnosemeldung an stderr, sondern senden.


Insgesamt würde ich einen Funktionsaufruf in einem bedingten Makro anstatt eingebetteten Code gewickelt verwenden. YMMV.

#ifdef NDEBUG 
    #define DEBUG_PUTS(level, s) 
#else 
    #define DEBUG_PUTS(level, s) debug_puts((level), __FILE__, __LINE__, (s)) 
#endif