libfoedus-core
FOEDUS Core Library

Brings error stacktrace information as return value of functions. More...

Detailed Description

Brings error stacktrace information as return value of functions.

This is returned by many API functions. As it brings stacktrace information, it's more informative than just returning ErrorCode. However, note that instantiating and augmenting this stack object has some overhead.

Why not exception
A couple of reasons:
  • Performance
  • Portability
  • Our Google C++ Coding Style overlord said so
We are not even sure what exceptions would look like in future environments. So, we don't throw or catch any exceptions in our program.
Macros to help use ErrorStack
In most places, you should use kRetOk, CHECK_ERROR(x), or ERROR_STACK(e) to handle this class. See the doucments of those macros.
Forced return code checking
An error code must be checked by some code, else it will abort with an "error-not-checked" error in stderr. We might later make this warning instead of aborting, but we should keep the current setting for a while to check for undesired coding. Once you get used to, making it sure is quite effortless.
Maximum stack trace depth
When the return code is an error code, we propagate back the stack trace for easier debugging. We could have a linked-list for this and, to ameriolate allocate/delete cost for it, a TLS object pool. Unfortunately, it causes issues in some environments and is not so readable/maintainable. Instead, we limit the depth of stacktraces stored in this object to a reasonable number enough for debugging; kMaxStackDepth. We then store just line numbers and const pointers to file names. No heap allocation. The only thing that has to be allocated on heap is a custom error message. However, there are not many places that use custom messages, so the cost usually doesn't happen.
Moveable/Copiable
This object is copiable. Further, the copy constructor and copy assignment operator are equivalent to move. Although they take a const reference, we steal its checked_ and custom_message_. This might be confusing, but much more efficient without C++11. As this object is copied so many times, we take this approach.

This class is header-only except output(), dump_and_abort(), and std::ostream redirect.

Definition at line 81 of file error_stack.hpp.

#include <error_stack.hpp>

Public Types

enum  Constants { kMaxStackDepth = 8 }
 Constant values. More...
 

Public Member Functions

 ErrorStack ()
 Empty constructor. More...
 
 ErrorStack (ErrorCode code)
 Instantiate a return code without a custom error message nor stacktrace. More...
 
 ErrorStack (const char *filename, const char *func, uint32_t linenum, ErrorCode code, const char *custom_message=nullptr)
 Instantiate a return code with stacktrace and optionally a custom error message. More...
 
 ErrorStack (const ErrorStack &other)
 Copy constructor. More...
 
 ErrorStack (const ErrorStack &other, const char *filename, const char *func, uint32_t linenum, const char *more_custom_message=nullptr)
 Copy constructor to augment the stacktrace. More...
 
ErrorStackoperator= (const ErrorStack &other)
 Assignment operator. More...
 
 ~ErrorStack ()
 Will warn in stderr if the error code is not checked yet. More...
 
bool is_error () const
 Returns if this return code is not kErrorCodeOk. More...
 
ErrorCode get_error_code () const
 Return the integer error code. More...
 
const char * get_message () const
 Returns the error message inferred by the error code. More...
 
const char * get_custom_message () const
 Returns the custom error message. More...
 
void copy_custom_message (const char *message)
 Copy the given custom message into this object. More...
 
void clear_custom_message ()
 Deletes custom message from this object. More...
 
void append_custom_message (const char *more_custom_message)
 Appends more custom error message at the end. More...
 
uint16_t get_stack_depth () const
 Returns the depth of stack this error code has collected. More...
 
uint32_t get_linenum (uint16_t stack_index) const
 Returns the line number of the given stack position. More...
 
const char * get_filename (uint16_t stack_index) const
 Returns the file name of the given stack position. More...
 
const char * get_func (uint16_t stack_index) const
 Returns the function name of the given stack position. More...
 
int get_os_errno () const
 Global errno of the system as of instantiation of this error stack. More...
 
void verify () const
 Output a warning to stderr if the error is not checked yet. More...
 
void output (std::ostream *ptr) const
 Describe this object to the given stream. More...
 
void dump_and_abort (const char *abort_message) const
 Describe this object to std::cerr and then abort. More...
 

Static Public Member Functions

static std::string get_recent_dump_and_abort ()
 Signal handler can get the dump information via this. More...
 

Friends

std::ostream & operator<< (std::ostream &o, const ErrorStack &obj)
 

Member Enumeration Documentation

Constant values.

Enumerator
kMaxStackDepth 

Maximum stack trace depth.

Definition at line 84 of file error_stack.hpp.

84  {
86  kMaxStackDepth = 8,
87  };
Maximum stack trace depth.
Definition: error_stack.hpp:86

Constructor & Destructor Documentation

foedus::ErrorStack::ErrorStack ( )
inline

Empty constructor.

This is same as duplicating kRetOk.

Definition at line 253 of file error_stack.hpp.

254  : custom_message_(CXX11_NULLPTR), os_errno_(0), error_code_(kErrorCodeOk),
255  stack_depth_(0), checked_(true) {
256 }
#define CXX11_NULLPTR
Used in public headers in place of "nullptr" of C++11.
Definition: cxx11.hpp:132
0 means no-error.
Definition: error_code.hpp:87
foedus::ErrorStack::ErrorStack ( ErrorCode  code)
inlineexplicit

Instantiate a return code without a custom error message nor stacktrace.

Parameters
[in]codeError code, either kErrorCodeOk or real errors.

This is the most (next to kRetOk) light-weight way to create/propagate a return code. Use this one if you do not need a detail information to debug the error (eg, error whose cause is obvious, an expected error that is immediately caught, etc).

Definition at line 258 of file error_stack.hpp.

259  : custom_message_(CXX11_NULLPTR), os_errno_(errno), error_code_(code),
260  stack_depth_(0), checked_(false) {
261 }
#define CXX11_NULLPTR
Used in public headers in place of "nullptr" of C++11.
Definition: cxx11.hpp:132
foedus::ErrorStack::ErrorStack ( const char *  filename,
const char *  func,
uint32_t  linenum,
ErrorCode  code,
const char *  custom_message = nullptr 
)
inline

Instantiate a return code with stacktrace and optionally a custom error message.

Parameters
[in]filenamefile name of the current place. It must be a const and permanent string, such as what "__FILE__" returns. Note that we do NOT do deep-copy of the strings.
[in]funcfunctiona name of the current place. Must be a const-permanent as well, such as "__FUNCTION__" of gcc/MSVC or C++11's func.
[in]linenumline number of the current place. Usually "__LINE__".
[in]codeError code, must be real errors.
[in]custom_messageOptional custom error message in addition to the default one inferred from error code. If you pass a non-NULL string to this argument, we do deep-copy, so it's EXPENSIVE!

Definition at line 263 of file error_stack.hpp.

References ASSERT_ND, copy_custom_message(), and foedus::kErrorCodeOk.

265  : custom_message_(CXX11_NULLPTR), os_errno_(errno), error_code_(code), stack_depth_(1),
266  checked_(false) {
267  ASSERT_ND(code != kErrorCodeOk);
268  filenames_[0] = filename;
269  funcs_[0] = func;
270  linenums_[0] = linenum;
271  copy_custom_message(custom_message);
272 }
#define CXX11_NULLPTR
Used in public headers in place of "nullptr" of C++11.
Definition: cxx11.hpp:132
0 means no-error.
Definition: error_code.hpp:87
void copy_custom_message(const char *message)
Copy the given custom message into this object.
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72

Here is the call graph for this function:

foedus::ErrorStack::ErrorStack ( const ErrorStack other)
inline

Copy constructor.

Definition at line 274 of file error_stack.hpp.

References operator=().

275  : custom_message_(CXX11_NULLPTR) {
276  operator=(other);
277 }
#define CXX11_NULLPTR
Used in public headers in place of "nullptr" of C++11.
Definition: cxx11.hpp:132
ErrorStack & operator=(const ErrorStack &other)
Assignment operator.

Here is the call graph for this function:

foedus::ErrorStack::ErrorStack ( const ErrorStack other,
const char *  filename,
const char *  func,
uint32_t  linenum,
const char *  more_custom_message = nullptr 
)
inline

Copy constructor to augment the stacktrace.

Definition at line 279 of file error_stack.hpp.

References append_custom_message(), foedus::kErrorCodeOk, kMaxStackDepth, LIKELY, and operator=().

281  : custom_message_(CXX11_NULLPTR) {
282  // Invariant: if kErrorCodeOk, no more processing
283  if (LIKELY(other.error_code_ == kErrorCodeOk)) {
284  this->error_code_ = kErrorCodeOk;
285  return;
286  }
287 
288  operator=(other);
289  // augment stacktrace
290  if (stack_depth_ != 0 && stack_depth_ < kMaxStackDepth) {
291  filenames_[stack_depth_] = filename;
292  funcs_[stack_depth_] = func;
293  linenums_[stack_depth_] = linenum;
294  ++stack_depth_;
295  }
296  // augment custom error message
297  if (more_custom_message) {
298  append_custom_message(more_custom_message);
299  }
300 }
#define CXX11_NULLPTR
Used in public headers in place of "nullptr" of C++11.
Definition: cxx11.hpp:132
#define LIKELY(x)
Hints that x is highly likely true.
Definition: compiler.hpp:103
ErrorStack & operator=(const ErrorStack &other)
Assignment operator.
void append_custom_message(const char *more_custom_message)
Appends more custom error message at the end.
0 means no-error.
Definition: error_code.hpp:87
Maximum stack trace depth.
Definition: error_stack.hpp:86

Here is the call graph for this function:

foedus::ErrorStack::~ErrorStack ( )
inline

Will warn in stderr if the error code is not checked yet.

Definition at line 326 of file error_stack.hpp.

References clear_custom_message(), foedus::kErrorCodeOk, LIKELY, and verify().

326  {
327  // Invariant: if kErrorCodeOk, no more processing
328  if (LIKELY(error_code_ == kErrorCodeOk)) {
329  return;
330  }
331 #ifdef DEBUG
332  // We output warning if some error code is not checked, but we don't do so in release mode.
333  verify();
334 #endif // DEBUG
336 }
#define LIKELY(x)
Hints that x is highly likely true.
Definition: compiler.hpp:103
0 means no-error.
Definition: error_code.hpp:87
void clear_custom_message()
Deletes custom message from this object.
void verify() const
Output a warning to stderr if the error is not checked yet.

Here is the call graph for this function:

Member Function Documentation

void foedus::ErrorStack::append_custom_message ( const char *  more_custom_message)
inline

Appends more custom error message at the end.

Definition at line 364 of file error_stack.hpp.

References copy_custom_message(), foedus::kErrorCodeOk, and LIKELY.

Referenced by ErrorStack().

364  {
365  // Invariant: if kErrorCodeOk, no more processing
366  if (LIKELY(error_code_ == kErrorCodeOk)) {
367  return;
368  }
369  // augment custom error message
370  if (custom_message_) {
371  // concat
372  size_t cur_len = std::strlen(custom_message_);
373  size_t more_len = std::strlen(more_custom_message);
374  char *copied = new char[cur_len + more_len + 1];
375  if (copied) {
376  custom_message_ = copied;
377  std::memcpy(copied, custom_message_, cur_len);
378  std::memcpy(copied + cur_len, more_custom_message, more_len + 1);
379  }
380  } else {
381  copy_custom_message(more_custom_message); // just put the new message
382  }
383 }
#define LIKELY(x)
Hints that x is highly likely true.
Definition: compiler.hpp:103
0 means no-error.
Definition: error_code.hpp:87
void copy_custom_message(const char *message)
Copy the given custom message into this object.

Here is the call graph for this function:

Here is the caller graph for this function:

void foedus::ErrorStack::clear_custom_message ( )
inline

Deletes custom message from this object.

Definition at line 339 of file error_stack.hpp.

References CXX11_NULLPTR, and UNLIKELY.

Referenced by copy_custom_message(), and ~ErrorStack().

339  {
340  if (UNLIKELY(custom_message_)) {
341  delete[] custom_message_;
342  custom_message_ = CXX11_NULLPTR;
343  }
344 }
#define CXX11_NULLPTR
Used in public headers in place of "nullptr" of C++11.
Definition: cxx11.hpp:132
#define UNLIKELY(x)
Hints that x is highly likely false.
Definition: compiler.hpp:104

Here is the caller graph for this function:

void foedus::ErrorStack::copy_custom_message ( const char *  message)
inline

Copy the given custom message into this object.

Definition at line 346 of file error_stack.hpp.

References clear_custom_message(), foedus::kErrorCodeOk, and LIKELY.

Referenced by append_custom_message(), and ErrorStack().

346  {
347  // Invariant: if kErrorCodeOk, no more processing
348  if (LIKELY(error_code_ == kErrorCodeOk)) {
349  return;
350  }
351 
353  if (message) {
354  // do NOT use strdup to make sure new/delete everywhere.
355  size_t len = std::strlen(message);
356  char *copied = new char[len + 1]; // +1 for null terminator
357  if (copied) {
358  custom_message_ = copied;
359  std::memcpy(copied, message, len + 1);
360  }
361  }
362 }
#define LIKELY(x)
Hints that x is highly likely true.
Definition: compiler.hpp:103
0 means no-error.
Definition: error_code.hpp:87
void clear_custom_message()
Deletes custom message from this object.

Here is the call graph for this function:

Here is the caller graph for this function:

void foedus::ErrorStack::dump_and_abort ( const char *  abort_message) const

Describe this object to std::cerr and then abort.

This also leaves the dump information in static variable so that a signal handler pick it up.

Definition at line 61 of file error_stack.cpp.

References ASSERT_ND, and foedus::print_backtrace().

Referenced by verify().

61  {
62  std::stringstream str;
63  str << "foedus::ErrorStack::dump_and_abort: " << abort_message << std::endl << *this << std::endl;
64  str << print_backtrace();
65 
66  static_recent_dump_and_abort += str.str();
67  LOG(FATAL) << str.str();
68  ASSERT_ND(false);
69  std::cout.flush();
70  std::cerr.flush();
71  std::abort();
72 }
std::string static_recent_dump_and_abort
Leaves recent dump information in a static global variable so that a signal handler can pick it...
Definition: error_stack.cpp:59
std::string print_backtrace()
Prints out backtrace.
Definition: assert_nd.cpp:37
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72

Here is the call graph for this function:

Here is the caller graph for this function:

const char * foedus::ErrorStack::get_custom_message ( ) const
inline

Returns the custom error message.

Definition at line 399 of file error_stack.hpp.

References CXX11_NULLPTR, and foedus::kErrorCodeOk.

Referenced by foedus::FixedErrorStack::from_error_stack(), foedus::FixedErrorStack::operator=(), and output().

399  {
400  // Invariant: if kErrorCodeOk, no more processing
401  if (error_code_ == kErrorCodeOk) {
402  return CXX11_NULLPTR;
403  }
404  return custom_message_;
405 }
#define CXX11_NULLPTR
Used in public headers in place of "nullptr" of C++11.
Definition: cxx11.hpp:132
0 means no-error.
Definition: error_code.hpp:87

Here is the caller graph for this function:

ErrorCode foedus::ErrorStack::get_error_code ( ) const
inline

Return the integer error code.

Definition at line 390 of file error_stack.hpp.

Referenced by foedus::FixedErrorStack::from_error_stack(), and foedus::FixedErrorStack::operator=().

390  {
391  checked_ = true;
392  return error_code_;
393 }

Here is the caller graph for this function:

const char * foedus::ErrorStack::get_filename ( uint16_t  stack_index) const
inline

Returns the file name of the given stack position.

Definition at line 424 of file error_stack.hpp.

References ASSERT_ND, CXX11_NULLPTR, and foedus::kErrorCodeOk.

Referenced by foedus::FixedErrorStack::from_error_stack(), foedus::FixedErrorStack::operator=(), and output().

424  {
425  // Invariant: if kErrorCodeOk, no more processing
426  if (error_code_ == kErrorCodeOk) {
427  return CXX11_NULLPTR;
428  }
429  ASSERT_ND(stack_index < stack_depth_);
430  return filenames_[stack_index];
431 }
#define CXX11_NULLPTR
Used in public headers in place of "nullptr" of C++11.
Definition: cxx11.hpp:132
0 means no-error.
Definition: error_code.hpp:87
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72

Here is the caller graph for this function:

const char * foedus::ErrorStack::get_func ( uint16_t  stack_index) const
inline

Returns the function name of the given stack position.

Definition at line 433 of file error_stack.hpp.

References ASSERT_ND, CXX11_NULLPTR, and foedus::kErrorCodeOk.

Referenced by foedus::FixedErrorStack::from_error_stack(), foedus::FixedErrorStack::operator=(), and output().

433  {
434  // Invariant: if kErrorCodeOk, no more processing
435  if (error_code_ == kErrorCodeOk) {
436  return CXX11_NULLPTR;
437  }
438  ASSERT_ND(stack_index < stack_depth_);
439  return funcs_[stack_index];
440 }
#define CXX11_NULLPTR
Used in public headers in place of "nullptr" of C++11.
Definition: cxx11.hpp:132
0 means no-error.
Definition: error_code.hpp:87
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72

Here is the caller graph for this function:

uint32_t foedus::ErrorStack::get_linenum ( uint16_t  stack_index) const
inline

Returns the line number of the given stack position.

Definition at line 415 of file error_stack.hpp.

References ASSERT_ND, and foedus::kErrorCodeOk.

Referenced by foedus::FixedErrorStack::from_error_stack(), foedus::FixedErrorStack::operator=(), and output().

415  {
416  // Invariant: if kErrorCodeOk, no more processing
417  if (error_code_ == kErrorCodeOk) {
418  return 0;
419  }
420  ASSERT_ND(stack_index < stack_depth_);
421  return linenums_[stack_index];
422 }
0 means no-error.
Definition: error_code.hpp:87
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72

Here is the caller graph for this function:

const char * foedus::ErrorStack::get_message ( ) const
inline

Returns the error message inferred by the error code.

Definition at line 395 of file error_stack.hpp.

References foedus::get_error_message().

Referenced by output().

395  {
396  return get_error_message(error_code_);
397 }
const char * get_error_message(ErrorCode code)
Returns the error messages corresponding to ErrorCode enum defined in error_code.xmacro.
Definition: error_code.hpp:120

Here is the call graph for this function:

Here is the caller graph for this function:

int foedus::ErrorStack::get_os_errno ( ) const
inline

Global errno of the system as of instantiation of this error stack.

Definition at line 442 of file error_stack.hpp.

References foedus::kErrorCodeOk.

Referenced by foedus::FixedErrorStack::from_error_stack(), and foedus::FixedErrorStack::operator=().

442  {
443  // Invariant: if kErrorCodeOk, no more processing
444  if (error_code_ == kErrorCodeOk) {
445  return 0;
446  }
447  return os_errno_;
448 }
0 means no-error.
Definition: error_code.hpp:87

Here is the caller graph for this function:

std::string foedus::ErrorStack::get_recent_dump_and_abort ( )
static

Signal handler can get the dump information via this.

Definition at line 74 of file error_stack.cpp.

References foedus::static_recent_dump_and_abort.

74  {
76 }
std::string static_recent_dump_and_abort
Leaves recent dump information in a static global variable so that a signal handler can pick it...
Definition: error_stack.cpp:59
uint16_t foedus::ErrorStack::get_stack_depth ( ) const
inline

Returns the depth of stack this error code has collected.

Definition at line 407 of file error_stack.hpp.

References foedus::kErrorCodeOk.

Referenced by foedus::FixedErrorStack::from_error_stack(), foedus::FixedErrorStack::operator=(), and output().

407  {
408  // Invariant: if kErrorCodeOk, no more processing
409  if (error_code_ == kErrorCodeOk) {
410  return 0;
411  }
412  return stack_depth_;
413 }
0 means no-error.
Definition: error_code.hpp:87

Here is the caller graph for this function:

ErrorStack & foedus::ErrorStack::operator= ( const ErrorStack other)
inline

Assignment operator.

Definition at line 302 of file error_stack.hpp.

References CXX11_NULLPTR, foedus::kErrorCodeOk, and LIKELY.

Referenced by ErrorStack().

302  {
303  // Invariant: if kErrorCodeOk, no more processing
304  if (LIKELY(other.error_code_ == kErrorCodeOk)) {
305  this->error_code_ = kErrorCodeOk;
306  return *this;
307  }
308 
309  // this copy assignment is actually a move assignment.
310  // checked_/custom_message_ are mutable for that.
311  custom_message_ = other.custom_message_; // steal.
312  other.custom_message_ = CXX11_NULLPTR; // simply stolen. much more efficient.
313  stack_depth_ = other.stack_depth_;
314  for (int i = 0; i < other.stack_depth_; ++i) {
315  filenames_[i] = other.filenames_[i];
316  funcs_[i] = other.funcs_[i];
317  linenums_[i] = other.linenums_[i];
318  }
319  os_errno_ = other.os_errno_;
320  error_code_ = other.error_code_;
321  checked_ = false;
322  other.checked_ = true;
323  return *this;
324 }
#define CXX11_NULLPTR
Used in public headers in place of "nullptr" of C++11.
Definition: cxx11.hpp:132
#define LIKELY(x)
Hints that x is highly likely true.
Definition: compiler.hpp:103
0 means no-error.
Definition: error_code.hpp:87

Here is the caller graph for this function:

void foedus::ErrorStack::output ( std::ostream *  ptr) const

Describe this object to the given stream.

Definition at line 30 of file error_stack.cpp.

References get_custom_message(), foedus::get_error_name(), get_filename(), get_func(), get_linenum(), get_message(), get_stack_depth(), is_error(), kMaxStackDepth, and foedus::assorted::os_error().

Referenced by foedus::operator<<().

30  {
31  std::ostream &o = *ptr; // just to workaround non-const reference rule.
32  if (!is_error()) {
33  o << "No error";
34  } else {
35  o << get_error_name(error_code_) << "(" << error_code_ << "):" << get_message();
36  if (os_errno_ != 0) {
37  o << " (Latest system call error=" << assorted::os_error(os_errno_) << ")";
38  }
39  if (get_custom_message()) {
40  o << " (Additional message=" << get_custom_message() << ")";
41  }
42 
43  for (uint16_t stack_index = 0; stack_index < get_stack_depth(); ++stack_index) {
44  o << std::endl << " " << get_filename(stack_index)
45  << ":" << get_linenum(stack_index) << ": ";
46  if (get_func(stack_index) != nullptr) {
47  o << get_func(stack_index) << "()";
48  }
49  }
51  o << std::endl << " .. and more. Increase kMaxStackDepth to see full stacktraces";
52  }
53  }
54 }
const char * get_error_name(ErrorCode code)
Returns the names of ErrorCode enum defined in error_code.xmacro.
Definition: error_code.hpp:108
const char * get_filename(uint16_t stack_index) const
Returns the file name of the given stack position.
Maximum stack trace depth.
Definition: error_stack.hpp:86
uint16_t get_stack_depth() const
Returns the depth of stack this error code has collected.
uint32_t get_linenum(uint16_t stack_index) const
Returns the line number of the given stack position.
const char * get_custom_message() const
Returns the custom error message.
std::string os_error()
Thread-safe strerror(errno).
const char * get_func(uint16_t stack_index) const
Returns the function name of the given stack position.
const char * get_message() const
Returns the error message inferred by the error code.
bool is_error() const
Returns if this return code is not kErrorCodeOk.

Here is the call graph for this function:

Here is the caller graph for this function:

void foedus::ErrorStack::verify ( ) const
inline

Output a warning to stderr if the error is not checked yet.

Definition at line 450 of file error_stack.hpp.

References dump_and_abort(), foedus::kErrorCodeOk, and LIKELY.

Referenced by ~ErrorStack().

450  {
451  // Invariant: if kErrorCodeOk, no more processing
452  if (LIKELY(error_code_ == kErrorCodeOk)) {
453  return;
454  }
455  if (!checked_) {
456  dump_and_abort("Return value is not checked. ErrorStack must be checked");
457  }
458 }
#define LIKELY(x)
Hints that x is highly likely true.
Definition: compiler.hpp:103
0 means no-error.
Definition: error_code.hpp:87
void dump_and_abort(const char *abort_message) const
Describe this object to std::cerr and then abort.
Definition: error_stack.cpp:61

Here is the call graph for this function:

Here is the caller graph for this function:

Friends And Related Function Documentation

std::ostream& operator<< ( std::ostream &  o,
const ErrorStack obj 
)
friend

Definition at line 78 of file error_stack.cpp.

78  {
79  obj.output(&o);
80  return o;
81 }

The documentation for this class was generated from the following files: