hpp-util 6.0.0
Debugging tools for the HPP project.
Loading...
Searching...
No Matches
debug.hh
Go to the documentation of this file.
1// Copyright (C) 2008, 2009 by Florent Lamiraux, Thomas Moulard, CNRS.
2//
3
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8// 1. Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10//
11// 2. Redistributions in binary form must reproduce the above copyright
12// notice, this list of conditions and the following disclaimer in the
13// documentation and/or other materials provided with the distribution.
14//
15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
26// DAMAGE.
27//
28// This software is provided "as is" without warranty of any kind,
29// either expressed or implied, including but not limited to the
30// implied warranties of fitness for a particular purpose.
31//
32// See the COPYING file for more information.
33
34#ifndef HPP_UTIL_DEBUG_HH
35#define HPP_UTIL_DEBUG_HH
36#include <cstdlib>
37#include <fstream>
38#include <hpp/util/config.hh>
39#include <hpp/util/indent.hh>
40#include <ostream>
41#include <sstream>
42#include <vector>
43
44namespace hpp {
45namespace debug {
46class Output;
47class JournalOutput;
48class ConsoleOutput;
49
50class Channel;
51} // end of namespace debug
52} // end of namespace hpp.
53
54namespace hpp {
55namespace debug {
78HPP_UTIL_DLLAPI std::string getPrefix(const std::string& packageName);
79
89HPP_UTIL_DLLAPI std::string getFilename(const std::string& filename,
90 const std::string& packageName);
91
92namespace verbosityLevel {
93constexpr int none = 0;
94constexpr int error = 10;
95constexpr int warning = 20;
96constexpr int notice = 30;
97constexpr int info = 40;
98constexpr int benchmark = -1;
99} // namespace verbosityLevel
100
103
105HPP_UTIL_DLLAPI void setVerbosityLevel(int level);
106
108
109HPP_UTIL_DLLAPI void enableBenchmark(bool enable);
110
111inline bool isChannelEnabled(int channel) {
112 if (channel == verbosityLevel::benchmark) return isBenchmarkEnabled();
113 return getVerbosityLevel() >= channel;
114}
115
126 public:
127 explicit Output();
128 virtual ~Output();
129
130 virtual void write(const Channel& channel, char const* file, int line,
131 char const* function, const std::string& data) = 0;
132
133 virtual void write(const Channel& channel, char const* file, int line,
134 char const* function, const std::stringstream& data) = 0;
135
136 protected:
137 std::ostream& writePrefix(std::ostream& stream, const Channel& channel,
138 char const* file, int line, char const* function);
139};
140
152 public:
153 typedef std::vector<Output*> subscribers_t;
154
155 explicit Channel(char const* label, const subscribers_t& subscribers);
156 virtual ~Channel();
157
158 void write(char const* file, int line, char const* function,
159 const std::string& data);
160
161 void write(char const* file, int line, char const* function,
162 const std::stringstream& data);
163
164 const char* label() const;
165
166 private:
167 const char* label_;
168 subscribers_t subscribers_;
169};
170
173 public:
174 explicit JournalOutput(std::string filename);
176
177 void write(const Channel& channel, char const* file, int line,
178 char const* function, const std::string& data);
179
180 void write(const Channel& channel, char const* file, int line,
181 char const* function, const std::stringstream& data);
182
183 std::string getFilename() const;
184
185 private:
186 std::string filename;
187 std::string lastFunction;
188 std::ofstream stream;
189};
190
193 public:
194 explicit ConsoleOutput();
196 void write(const Channel& channel, char const* file, int line,
197 char const* function, const std::string& data);
198 void write(const Channel& channel, char const* file, int line,
199 char const* function, const std::stringstream& data);
200};
201
230} // end of namespace debug
231} // end of namespace hpp.
232
233namespace hpp {
234namespace debug {
236extern HPP_UTIL_DLLAPI Logging logging;
237} // end of namespace debug
238} // end of namespace hpp
239
240#ifdef HPP_DEBUG
241
244
246#define hppDebug(statement) \
247 do { \
248 using namespace ::hpp::debug; \
249 { \
250 statement; \
251 } \
252 } while (0)
253
255#define hppDebugStatement(statement) statement
256
258
261
266#define hppDout(channel, data) \
267 do { \
268 using namespace hpp; \
269 using namespace ::hpp::debug; \
270 if (isChannelEnabled(verbosityLevel::channel)) { \
271 std::stringstream __ss; \
272 __ss << data << iendl; \
273 logging.channel.write(__FILE__, __LINE__, __PRETTY_FUNCTION__, __ss); \
274 } \
275 } while (0)
276
281#define hppDoutFatal(channel, data) \
282 do { \
283 using namespace hpp; \
284 using namespace ::hpp::debug; \
285 std::stringstream __ss; \
286 __ss << data << iendl; \
287 logging.channel.write(__FILE__, __LINE__, __PRETTY_FUNCTION__, __ss); \
288 ::std::exit(EXIT_FAILURE); \
289 } while (1)
290
292
293#else
294
295#define hppDebug(statement) \
296 do { \
297 } while (0)
298#define hppDebugStatement(statement)
299#define hppDout(channel, data) \
300 do { \
301 } while (0)
302#define hppDoutFatal(channel, data) \
303 do { \
304 using namespace hpp; \
305 ::std::cerr << data << iendl; \
306 ::std::exit(EXIT_FAILURE); \
307 } while (1)
308
309#endif // HPP_DEBUG
310
311#endif
Receive debugging information.
Definition debug.hh:151
std::vector< Output * > subscribers_t
Definition debug.hh:153
Logging in console (std::cerr).
Definition debug.hh:192
Logging in journal file in the logging directory.
Definition debug.hh:172
Logging class owns all channels and outputs.
Definition debug.hh:203
Channel info
Technical information and debugging.
Definition debug.hh:225
Channel notice
User-oriented information.
Definition debug.hh:222
Channel error
Fatal problems channel.
Definition debug.hh:216
Channel warning
Non-fatal problems channel.
Definition debug.hh:219
ConsoleOutput console
Logs to console (i.e. stderr).
Definition debug.hh:209
JournalOutput journal
Logs to main journal file (i.e. journal.XXX.log).
Definition debug.hh:211
JournalOutput benchmarkJournal
Logs to benchmark journal file (i.e. benchmark.XXX.log).
Definition debug.hh:213
Channel benchmark
Benchmark information.
Definition debug.hh:228
Debugging output.
Definition debug.hh:125
virtual void write(const Channel &channel, char const *file, int line, char const *function, const std::string &data)=0
virtual void write(const Channel &channel, char const *file, int line, char const *function, const std::stringstream &data)=0
#define HPP_UTIL_DLLAPI
Definition config.hh:88
constexpr int notice
Definition debug.hh:96
constexpr int info
Definition debug.hh:97
constexpr int error
Definition debug.hh:94
constexpr int warning
Definition debug.hh:95
constexpr int benchmark
Definition debug.hh:98
constexpr int none
Definition debug.hh:93
HPP_UTIL_DLLAPI void setVerbosityLevel(int level)
Set the verbosity level.
Definition debug.cc:127
HPP_UTIL_DLLAPI Logging logging
Benchmark information.
Definition debug.cc:270
bool isChannelEnabled(int channel)
Definition debug.hh:111
HPP_UTIL_DLLAPI std::string getFilename(const std::string &filename, const std::string &packageName)
Compute the path of a file in the logging prefix.
Definition debug.cc:116
HPP_UTIL_DLLAPI int getVerbosityLevel()
Get the verbosity level.
Definition debug.cc:125
HPP_UTIL_DLLAPI void enableBenchmark(bool enable)
Definition debug.cc:131
HPP_UTIL_DLLAPI bool isBenchmarkEnabled()
Definition debug.cc:129
HPP_UTIL_DLLAPI std::string getPrefix(const std::string &packageName)
Compute the logging prefix.
Definition debug.cc:99
Definition assertion.hh:45