Funktionsaufrufe loggen
-
Hallo,
ich bin auf der Suche nach einer Möglichkeit, den Eintritt in und den Austritt aus Funktionen zu loggen. Außerdem sollten noch Angaben über die verwendeten Argumente der Funktion und wichtige Ereignisse geloggt werden. Zweck ist im Fehlerfall einen Überblick zu bekommen, was im Programm passiert ist.
Bisher habe ich das mit log4cxx gemacht, mit dem Log-Level habe ich dabei gesteuert, was ausgegeben wird und auf welchem Detailierungsgrad. Das Ganze sah dann so aus
INFO ********** BEGIN OF: ../src/tree/tree.cpp - Rev_Tree::Rev_Tree(int, int) ****************** INFO ********** BEGIN OF: ../src/tree/tree.cpp - void Rev_Tree::init() ************************* INFO ++++++++++ END OF: ../src/tree/tree.cpp - void Rev_Tree::init() +++++++++++++++++++++++++++ INFO ++++++++++ END OF: ../src/tree/tree.cpp - Rev_Tree::Rev_Tree(int, int) ++++++++++++++++++++ INFO ********** BEGIN OF: ../src/node/nd_creation.cpp - create ********************************* INFO ********** BEGIN OF: ../src/node/base_nd_creation_def.h - Base_Nd ************************* INFO ********** BEGIN OF: ../src/node/base_nd_creation_def.h - init **************************** INFO ++++++++++ END OF: ../src/node/base_nd_creation_def.h - init ++++++++++++++++++++++++++++++ INFO ++++++++++ END OF: ../src/node/base_nd_creation_def.h - Base_Nd +++++++++++++++++++++++++++ INFO ********** BEGIN OF: ../src/node/base_nd_creation_def.h - Nd_with_Anc ********************* INFO ++++++++++ END OF: ../src/node/base_nd_creation_def.h - Nd_with_Anc +++++++++++++++++++++++ INFO ********** BEGIN OF: ../src/node/nd_creation.cpp - Rev_Nd::Rev_Nd *********************** DEBUG old_node: 0 DEBUG has_first_segment: true INFO ++++++++++ END OF: ../src/node/nd_creation.cpp - Rev_Nd::Rev_Nd +++++++++++++++++++++++++ INFO ********** BEGIN OF: ../src/node/nd_creation.cpp - Prob_Nd::Prob_Nd() ********************* INFO ++++++++++ END OF: ../src/node/nd_creation.cpp - Prob_Nd::Prob_Nd() +++++++++++++++++++++++ INFO ********** BEGIN OF: ../src/node/base_nd_creation_def.h - Nd_with_NC ********************** INFO ++++++++++ END OF: ../src/node/base_nd_creation_def.h - Nd_with_NC ++++++++++++++++++++++++Offensichtlich ist das so aber reichlich unübersichtlich und wenig erhellend, wenn man verschachtelte Konstruktoraufrufe hat.
Von daher die Frage: Gibt es Tools, die sowas machen? Insbesondere wäre es wohl nützlich, das Ganze ähnlich einer Verzeichnisstruktur (also u.a. aufklappbar) dargestellt zu bekommen.
-
Ich mache sowas eigentlich selber.
Ich habe dazu eine globale Variable int depth;
die die einrückungstiefe bestimmt.Bei jedem Funktionseintritt wird sie erhöht, bei jedem austritt verringert.
Ich erstelle dazu einfach ein objekt auf den Stack, dass im Ctor und im Dtor die logeinträge schreibt.
Eine fertige Lösung kenne ich leider nicht...
-
naja - bauen kann man da schon was - aber was fertiges kenn ich da auch nicht.
musst dann aber halt in jeder funktion auch ganz oben dein erstelltes makro hinschreiben - und das hat mich bisher immer abgehalten, weil faulheit^^ich kenn auch nur das makro __FUNCTION__ was nicht nur kein standard ist, sondern zusätzlich auch nur den funktionsname liefert - mit überladungen wirds also schwer...
und auf so was hätt ich ja am wenigsten lust:void foo(int) { LOG_FUNTION("foo(int)") } void foo(float) { LOG_FUNCTION("foo(float)") }oder gibts da noch ne bessere variante, wenn man die überladungen unterscheiden möchte?
man könnte halt noch was mit __COUNTER__ basteln, aber das wäre auch nur, um es im log-file unterscheiden zu können - übersichtlich ist das nicht gerade...bb
-
unskilled schrieb:
ich kenn auch nur das makro __FUNCTION__
Als Alternative gibt es noch __PRETTY_FUNCTION__.
-
ingobulla schrieb:
unskilled schrieb:
ich kenn auch nur das makro __FUNCTION__
Als Alternative gibt es noch __PRETTY_FUNCTION__.
was aber der msvc nicht kann sondern nur der gcc?!
-
Ich schreibe HTML-Logbücher, die dann farblich unterlegt sind. Das ist eigentlich recht übersichtlich. Spezielle Funktionen bekommen dann eine spezielle Log-Funktion um sie besser darzustellen. Das ganze ist aber so aufgebaut, dass der Teil austauschbar ist, der das ganze auf die Platte schreibt, sprich man kann auch jederzeit auf .txt ausweichen.
Logger:
http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLLog.cppHTML-Writer:
http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLHtmlWriter.cppInterface:
http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLILogWriter.hppDas ganze is recht billig, aber effektiv :).
Und nach Funktion sortiert und aufklappbar würde das auch gehen mit a bissl javascript :).
rya
-
Scorcher24 schrieb:
Das ganze is recht billig, aber effektiv :).
Billig ist gut.
Scorcher24 schrieb:
Logger:
http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLLog.cppIst das switch wirklich nötig??!
-
volkard schrieb:
Scorcher24 schrieb:
Das ganze is recht billig, aber effektiv :).
Billig ist gut.
Scorcher24 schrieb:
Logger:
http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLLog.cppIst das switch wirklich nötig??!
Vllt nicht, aber ich hab das relativ fix in sehr kurzer Zeit gemacht :). Es macht das was es soll, daher habe ich nicht groß drauf geachtet...
-
Da dachte ich, endlich mal einen gefunden zu haben, der bewußt einfachen Code bastelt...
switch(x){ case 0: cout<<0; break; case 1: cout<<1; break; case 2: cout<<2; break; case 3: cout<<3; break; case 4: cout<<4; break; case 5: cout<<5; break; case 6: cout<<6; break; case 7: cout<<7; break; case 8: cout<<8; break; case 9: cout<<9; break; }
-
Okay, ich habs nochmal überarbytet
. Will ja nicht, dass man mich für unflexibel hält.
Jetzt geht auch sowas:log << LL_ERROR << "Fehler"Aber ich hab das halt nicht studiert, ich betreibe das als Hobby. Dass ich nicht mit euch studierten hier mithalten kann is mir durchaus bewusst. Aber auch einfache Lösungen haben ihre Berechtigung.Solange der Code sauber funktioniert, bin ich zufrieden.
-
Ich stolper zZ immer wieder über Zeug bei dem ich nicht recht weiss wonach ich googeln müsste,, diesmal zB:
class HIERSTEHTWAS className { // °°°°°°°°°°°° }wofür ist das Konstrukt/ wie nennt man es/ wo gibts Infos in Standard?
-
was ist denn hieristetwas?
wird wohl nen makro sein, was nur zu infozwecken da ist.
bsp.:#define MY_COOL_CLASS class MY_COOL_CLASS foo { };bb
-
konkret hier gesehen: http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLILogWriter.hpp
Sehe nur keine Makrodefinition .. aber ok
mit denen hab ichs eh nicht so
-
padreigh schrieb:
konkret hier gesehen: http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLILogWriter.hpp
Ah. dllexport.
http://msdn.microsoft.com/en-us/library/81h27t8c.aspx
-
padreigh schrieb:
konkret hier gesehen: http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NLILogWriter.hpp
Sehe nur keine Makrodefinition .. aber ok
mit denen hab ichs eh nicht soDefinition:
http://code.google.com/p/nightlighttv/source/browse/NightLight/trunk/NightLightDLL/NightLight.hpp#68// Export Macro for Win32 #if defined(WIN32) && defined(BUILD_NIGHTLIGHT) # define NLEXPORT _declspec(dllexport) #elif defined(WIN32) # define NLEXPORT _declspec(dllimport) #else # define NLEXPORT #endif
Ist nötig damit die Funktionen aus der .dll in die import library exportiert werden, bzw beim einbinden der DLL aus der importlibrary importiert werden.
rya.
-
das erklärt es, mit windows hab ichs noch weniger
danke