Encapsulate a string representation of a stack trace on supported platforms. Stack traces for code built with optimize=1 (or "Release" configs on Visual Studio) may be misleading (missng frames) due to inlining performed by the compiler, which is indepenent of the inline=0 / inline=1 build option and the ACE_INLINE / ACE_NO_INLINE macros.
More...
#include <Stack_Trace.h>
Public Member Functions |
| ACE_Stack_Trace (ssize_t starting_frame_offset=0, size_t num_frames=0) |
| Grab a snapshot of the current stack trace and hold it for later use.
|
const char * | c_str () const |
| Return buffer as a C-style string.
|
Static Private Attributes |
static const char | UNSUPPORTED [] = "<stack traces unsupported platform>" |
static const char | UNABLE_TO_GET_TRACE [] = "<unable to get trace>" |
Detailed Description
Encapsulate a string representation of a stack trace on supported platforms. Stack traces for code built with optimize=1 (or "Release" configs on Visual Studio) may be misleading (missng frames) due to inlining performed by the compiler, which is indepenent of the inline=0 / inline=1 build option and the ACE_INLINE / ACE_NO_INLINE macros.
A new conversion character, the question mark, was added to ACE_Log_Msg for stack trace logging. The %? conversion character was added as a convenience so that users need not instantiate an ACE_Stack_Trace instance solely for the purpose of printing it in an ACE logging message. The following are functionally equivalent:
These usage examples were shown in $ACE_ROOT/tests/Stack_Trace_Test.cpp.
- Note
- The stack trace functionality was currently supported on platforms:
- Any platform using glibc as its runtime library, or where ACE_HAS_EXECINFO_H is defined (this covers Linux and Mac) and gcc version >= 3.3.
- VxWorks, both kernel and RTP
- Solaris
- Windows 32 and 64 bit (Visual C++, excluding WinCE/mobile)
-
Since stack trace buffer size has limitation(
ACE_STACK_TRACE_SYMBUFSIZ
), you will not get a complete stack trace if ACE_STACK_TRACE_SYMBUFSIZ
value is less than actual stack trace data length. To get a complete stack trace, you need set ACE_STACK_TRACE_SYMBUFSIZ
with a larger value that is enough for the stack trace data in your config.h
file and rebuild ACE.
-
Using ACE logging mechanism (%?) to log the stack trace also has ACE_MAXLOGMSGLEN size limitation. To get a complete stack trace, you could use different output method. Following is an example.
Constructor & Destructor Documentation
ACE_Stack_Trace::ACE_Stack_Trace |
( |
ssize_t |
starting_frame_offset = 0 , |
|
|
size_t |
num_frames = 0 |
|
) |
| |
|
explicit |
Grab a snapshot of the current stack trace and hold it for later use.
- Parameters
-
starting_frame_offset | offset into the array of frames to start printing; 0 is the platform-specific offset for the first frame, positive numbers give less frames, negative give more frames |
num_frames | the number of stack frames to include (0 indicates platform-specific maximum) |
Member Function Documentation
const char * ACE_Stack_Trace::c_str |
( |
void |
| ) |
const |
Return buffer as a C-style string.
- Returns
- C-style string with string representation of stack trace.
- Note
- Lifecycle of string follows lifecycle of ACE_Stack_Trace instance.
void ACE_Stack_Trace::generate_trace |
( |
ssize_t |
starting_frame_offset, |
|
|
size_t |
num_frames |
|
) |
| |
|
private |
Member Data Documentation
size_t ACE_Stack_Trace::buflen_ |
|
private |
const char ACE_Stack_Trace::UNABLE_TO_GET_TRACE = "<unable to get trace>" |
|
staticprivate |
const char ACE_Stack_Trace::UNSUPPORTED = "<stack traces unsupported platform>" |
|
staticprivate |
The documentation for this class was generated from the following files: