2009-03-11 12 views
1

Muss ich in allen C-Funktionen Ein- und Ausgangsprotokolle hinzufügen?Automatische Eingabe Exit-Trace in C

Wenn ja, gibt es Möglichkeiten, die Eingabe und den Ausgang einer Funktion automatisch zu schreiben (ähnlich wie beim automatischen Ein-/Ausstieg mit aspektorientierter Programmierung in Java).

Die Anwendung, die ich schreibe, ist zeitkritisch und das Hinzufügen von Ein-/Ausstiegsanweisungen für jede Funktion kann die Leistung verzögern und macht den Code außerdem nicht lesbar.

+0

In welchem ​​Zweck möchten Sie das? Profiling oder Debugging? – epatel

+0

Es ist eigentlich ein ziemlich interessantes Thema. Es scheint da draußen genug Magie zu sein, um etwas in Richtung der Aspektprogrammierung in C zu unterstützen ... Wer weiß? –

+0

Seit ich gerade mit dem Codieren begonnen habe, dient der Zweck dem Debuggen. Aber in der späteren Phase könnte ich dies auch für das Profiling benötigen. –

Antwort

2

C keine Form der Selbstbeobachtung nicht unterstützt oder Sachen in der Laufzeit oder auf der virtuellen Maschine automatisch durch Magie zu tun; Es gibt keine virtuelle Maschine, und die Laufzeitunterstützung besteht im Grunde nur aus Bibliotheken mit "totem" Code, die Standardfunktionen bereitstellen.

Und als Subtwo darauf hingewiesen, wenn Sie etwas tun möchten (wie Log-Eingang/Ausgang), muss es getan werden und damit Zeit brauchen. Sie können diese Strafe nicht einfach "verstecken", es gibt sehr wenig Overhead, um es einzufügen.

Ein Standard-Profiler könnte Ihnen einige Einblicke geben, indem Sie Ihr Programm statistisch abtasten, um zu sehen, welche Funktionen ausgeführt werden, aber das wird nicht geben Sie die Aufrufreihenfolge, nur zufällige Positionen, wo Ihr Programm Code zum Zeitpunkt der Stichprobe ausgeführt wurde.

Sie könnten vielleicht zu einer Präprozessor-Trickserei wechseln, dies ist eine gebräuchliche Art, "Boilerplate" -Sachen wie Logging zu machen, indem Sie zum Beispiel einige Makros definieren, die Sie dann an den Ein-/Ausstiegspunkten jeder Funktion platzieren. Dennoch müssen Sie sich daran erinnern, die Makros einzubeziehen, und natürlich wird jede Leistungseinbuße bei der Protokollierung vorhanden sein.

1

Zunächst einmal. Wenn du etwas protokollieren willst, wird es Zeit brauchen, egal wie du es machst. Das ist durch Aspektprogrammierung oder etwas anderes. Wenn Ihre Anwendung zeitkritisch ist, sollten Sie einen Schalter haben, um das Debugging ein- und auszuschalten.

Update: Kasse http://perfinsp.sourceforge.net/hookit_linux.html

+0

Subtwo hat das Google-Foo. Netter Fang. – dmckee

+0

Danke für den Link. Lass mich nachsehen. –

0

Sehen Sie sich AspectC an, eine Variante von C, die mit aspektorientierten Funktionen erweitert wurde (genau wie AspectJ eine Variante von Java mit aspektorientierten Funktionen ist).

0

Sie könnten einige Kilometer aus der FUNKTION und einige Makros erhalten. Sie müssten für jede Funktion noch Ein- und Ausgangsmakros hinzufügen. Aber Sie müssen den Funktionsnamen nicht erneut eingeben.

Wenn Sie mit C++ RAII in Ordnung sind, dann brauchen Sie nur ein Eingabemakro in jeder Funktion.