|
|
|
@ -9,6 +9,9 @@ |
|
|
|
|
@license LGPL, see file <a href="license.html">COPYING</a> |
|
|
|
|
|
|
|
|
|
$Log$ |
|
|
|
|
Revision 1.3 2005/04/14 19:12:18 marc |
|
|
|
|
better formatting for operators |
|
|
|
|
|
|
|
|
|
Revision 1.2 2005/04/07 20:42:38 marc |
|
|
|
|
renamed loggerhierarchy from mrw.gccfunctiontrace to mrw.fn |
|
|
|
|
|
|
|
|
@ -108,27 +111,7 @@ extern "C" int main(int, char**); |
|
|
|
|
necessary, because otherwise access the incompletely initialized |
|
|
|
|
MRW-C++ library itself may cause a crash. |
|
|
|
|
|
|
|
|
|
I use the following log4cxx @c log4cxx::PropertyConfigurator |
|
|
|
|
configuration in the test program to enable all function traces, |
|
|
|
|
except from some third party and standard libraries: |
|
|
|
|
|
|
|
|
|
@verbatim |
|
|
|
|
log4j.rootLogger = OFF, A1 |
|
|
|
|
log4j.logger.mrw.fn = DEBUG, A1 |
|
|
|
|
log4j.logger.mrw.fn.log4cxx = OFF, A1 |
|
|
|
|
log4j.logger.mrw.fn.boost = OFF, A1 |
|
|
|
|
log4j.logger.mrw.fn.Thread = OFF, A1 |
|
|
|
|
log4j.logger.mrw.fn.mrw = OFF, A1 |
|
|
|
|
log4j.logger.mrw.fn.std = OFF, A1 |
|
|
|
|
log4j.logger.mrw.fn.new = OFF, A1 |
|
|
|
|
log4j.logger.mrw.fn.CppUnit = OFF, A1 |
|
|
|
|
log4j.logger.mrw.fn.__gnu_cxx = OFF, A1 |
|
|
|
|
log4j.appender.A1 = org.apache.log4j.FileAppender |
|
|
|
|
log4j.appender.A1.layout = org.apache.log4j.PatternLayout |
|
|
|
|
log4j.appender.A1.layout.ConversionPattern = %t-%-41c%m%n |
|
|
|
|
log4j.appender.A1.filename = filename.log |
|
|
|
|
@endverbatim |
|
|
|
|
|
|
|
|
|
A good default configuration is given in @ref AutoInitLog4cxx. |
|
|
|
|
Depending on your log4cxx configuration, a function trace may look |
|
|
|
|
e.g. like this (very simple configuration with very few additional |
|
|
|
|
information): |
|
|
|
@ -155,8 +138,10 @@ mrw.fn.anotherFunction / anotherFunction() |
|
|
|
|
@note The configurator is not installed automatically. If you |
|
|
|
|
want to trace e.g. on the console, you have to call @c |
|
|
|
|
log4cxx::BasicConfigurator::configure(); as first statement |
|
|
|
|
in your @c main(). @see @ref AutoInitLog4cxx if you also want to |
|
|
|
|
automatically configure @c log4cxx. |
|
|
|
|
in your @c main(). |
|
|
|
|
|
|
|
|
|
@see @ref AutoInitLog4cxx if you also want to automatically |
|
|
|
|
configure @c log4cxx. |
|
|
|
|
|
|
|
|
|
@section AutoFunctionTraceThread Multithreading |
|
|
|
|
|
|
|
|
@ -190,7 +175,9 @@ extern "C" void __cyg_profile_func_enter(void *this_fn, void*) { |
|
|
|
|
(p=hierarchy.find("::", p))!=std::string::npos; |
|
|
|
|
hierarchy.replace(p, 2, ".")); |
|
|
|
|
hierarchy.erase(hierarchy.rfind('(')); |
|
|
|
|
std::string::size_type p(hierarchy.rfind(' ', hierarchy.find('<'))); |
|
|
|
|
std::string::size_type p |
|
|
|
|
(hierarchy.rfind(' ', std::min(hierarchy.find('<'), |
|
|
|
|
hierarchy.find("operator")))); |
|
|
|
|
if (p!=std::string::npos) hierarchy.erase(0, p+1); |
|
|
|
|
log4cxx::Logger* logger |
|
|
|
|
(log4cxx::Logger::getLogger(_T("mrw.fn.")+hierarchy)); |
|
|
|
@ -223,7 +210,9 @@ extern "C" void __cyg_profile_func_exit(void *this_fn, void*) { |
|
|
|
|
(p=hierarchy.find("::", p))!=std::string::npos; |
|
|
|
|
hierarchy.replace(p, 2, ".")); |
|
|
|
|
hierarchy.erase(hierarchy.find('(')); |
|
|
|
|
std::string::size_type p(hierarchy.rfind(' ', hierarchy.find('<'))); |
|
|
|
|
std::string::size_type p |
|
|
|
|
(hierarchy.rfind(' ', std::min(hierarchy.find('<'), |
|
|
|
|
hierarchy.find("operator")))); |
|
|
|
|
if (p!=std::string::npos) hierarchy.erase(0, p+1); |
|
|
|
|
log4cxx::Logger* logger |
|
|
|
|
(log4cxx::Logger::getLogger(_T("mrw.fn.")+hierarchy)); |
|
|
|
|