Lassen Sie uns sagen, ich habePflanzgut Aufruf Kontext GCC Präprozessormakro Werte zu Zielfunktion
foo() {
bar();
}
wo foo
liegt in f.c
und bar
liegt in b.c
, das heißt b.h
in f.c
enthalten ist. Ich möchte bar
ändern zu drucken, dass sie von jeder Funktion aufgerufen wurde foo
die sie aufruft, etwa so:
bar() {
printf ("Called from line %d in file %s",?,?);
/* Run as usual */
}
ich diese zwei Stücke von Informationen aus dem predefined GCC preprocessor macros__LINE__
und __FILE__
erhalten möchten. Diese werden jedoch offensichtlich zu der Zeile printf
in b.c
und dem Pfad b.c
jeweils ausgewertet, wenn sie einfach in die printf
gesteckt werden.
Kann ich propagieren irgendwie die Werte von __LINE__
und __FILE__
vom rufenden Zusammenhang mit den printf
in bar
, so „von der Linie x in der Datei foo.c Called“ anstelle gedruckt?
ich versuchte bar
zu bar2
umbenennen und dann eine Delegator-Funktion in der Datei-Header definieren b.h
:
bar() {
printf ("Called from line %d in file %s",__LINE__,__FILE__);
bar2();
}
Die Idee war, dass die #include
Richtlinie den Header-Code in der Quelldatei f.c
und dann würde kopieren ersetzen der Pfad zu f.c
bzw. Zeilennummer. Dies gab mir jedoch einen doppelten Definitionsfehler über die verschiedenen Übersetzungseinheiten.
Als nächstes habe ich versucht, den static
Modifizierer zu der Headerdefinition von bar2
hinzuzufügen, um mehrere Definitionen zu ermöglichen. Ich kann dann ohne Fehler kompilieren und das Programm ausführen, aber nur bar.h
wird gedruckt.
Wohin gehe ich falsch? Ich bin sicher, dass es einen eleganteren Weg gibt, dies zu tun.
Fragen:
Warum nicht einfach einen Debugger wie GDB benutzen? Dies ist ein Kernel-Code.
Warum nicht auf der Anruferseite debuggen? Große Codebasis.
EDIT:
Warum funktioniert das nicht?
#ifdef DEBUG_PALLOC
#define palloc_get_page(FLAGS) (palloc_get_page_debug (FLAGS, __FILE__,__LINE__))
#else
void *palloc_get_page (enum palloc_flags);
#endif
Sie müssen es als Parameter übergeben. OT: Weißt du was FAQ bedeutet? –
Whoops, mein Schlechter. FAQ mit Fragen ersetzt Danke für die Antwort. Kannst du mir sagen, warum das nicht möglich ist? Kann ich nicht überall lokale Definitionen der Funktion haben, die nach dem Drucken auf globale Symbole zeigen? –