]>
Dogcows Code - chaz/yoink/blob - debug.cpp
d5b153489c086b4613863e1eafaba83c9648542f
1 ////////////////////////////////////////////////////////////////////////////////
3 // Author: Andy Rushton
4 // Copyright: (c) Southampton University 1999-2004
5 // (c) Andy Rushton 2004-2009
6 // License: BSD License, see ../docs/license.html
8 ////////////////////////////////////////////////////////////////////////////////
11 #include "dprintf.hpp"
16 ////////////////////////////////////////////////////////////////////////////////
21 ////////////////////////////////////////////////////////////////////////////////
23 static std::string
format(const char* file
, int line
, const char* function
, const char* message
)
25 return dformat("%s:%d:%s: assertion failed: %s",
28 (function
? function
: "") ,
29 (message
? message
: ""));
32 ////////////////////////////////////////////////////////////////////////////////
34 assert_failed::assert_failed(const char* file
, int line
, const char* function
, const char* message
)
36 std::logic_error(format(file
, line
, function
, message
))
40 assert_failed::~assert_failed(void) throw()
44 ////////////////////////////////////////////////////////////////////////////////
46 static unsigned _debug_depth
= 0;
47 static bool _debug_global
= false;
48 static bool _debug_set
= false;
49 static bool _debug_recurse
= false;
50 static bool _debug_read
= false;
51 static char* _debug_match
= 0;
52 static const debug_trace
* debug_last
= 0;
54 void debug_global(const char* file
, int line
, const char* function
, bool state
)
56 _debug_global
= state
;
57 fprintf(stderr
, "%s:%i:[%i]%s ", file
, line
, _debug_depth
, function
? function
: "");
58 fprintf(stderr
, "debug global : %s\n", _debug_global
? "on" : "off");
61 void debug_assert_fail(const char* file
, int line
, const char* function
, const char* test
)
64 fprintf(stderr
, "%s:%i:[%i]%s: assertion failed: %s\n",
65 file
, line
, _debug_depth
, function
? function
: "", test
);
66 if (debug_last
) debug_last
->stackdump();
67 throw assert_failed(file
, line
, function
, test
);
70 ////////////////////////////////////////////////////////////////////////////////
72 debug_trace::debug_trace(const char* f
, int l
, const char* fn
) :
73 m_file(f
), m_line(l
), m_function(fn
? fn
: ""),
74 m_depth(0), m_last(debug_last
), m_dbg(false), m_old(false)
78 _debug_match
= getenv("DEBUG");
79 _debug_recurse
= getenv("DEBUG_LOCAL") == 0;
82 m_dbg
= _debug_set
|| (_debug_match
&& (!_debug_match
[0] || (strcmp(_debug_match
, m_file
) == 0)));
84 if (m_dbg
&& _debug_recurse
)
86 m_depth
= ++_debug_depth
;
88 if (debug()) report(std::string("entering ") + (m_function
? m_function
: ""));
91 debug_trace::~debug_trace(void)
93 if (debug()) report("leaving");
99 const char* debug_trace::file(void) const
104 int debug_trace::line(void) const
109 bool debug_trace::debug(void) const
111 return m_dbg
|| _debug_global
;
114 void debug_trace::debug_on(int l
, bool recurse
)
120 report(l
, std::string("debug on") + (recurse
? " recursive" : ""));
123 void debug_trace::debug_off(int l
)
125 if (debug()) report(l
, std::string("debug off"));
130 void debug_trace::prefix(int l
) const
132 fprintf(stderr
, "%s:%i:[%i]%s ", m_file
, l
, m_depth
, m_function
? m_function
: "");
135 void debug_trace::do_report(int l
, const std::string
& message
) const
138 fprintf(stderr
, "%s\n", message
.c_str());
142 void debug_trace::do_report(const std::string
& message
) const
144 do_report(m_line
, message
);
147 void debug_trace::report(int l
, const std::string
& message
) const
149 do_report(l
, message
);
152 void debug_trace::report(const std::string
& message
) const
154 report(m_line
, message
);
157 void debug_trace::error(int l
, const std::string
& message
) const
159 do_report(l
, "ERROR: " + message
);
162 void debug_trace::error(const std::string
& message
) const
164 error(m_line
, message
);
167 void debug_trace::stackdump(int l
, const std::string
& message
) const
169 do_report(l
, message
);
173 void debug_trace::stackdump(const std::string
& message
) const
175 stackdump(m_line
, message
);
178 void debug_trace::stackdump(void) const
180 for (const debug_trace
* item
= this; item
; item
= item
->m_last
)
181 item
->do_report("...called from here");
185 ////////////////////////////////////////////////////////////////////////////////
187 } // end namespace stlplus
This page took 0.040211 seconds and 3 git commands to generate.