1 /////////////////////////////////////////////////////////////////////////////// 
   2 // Name:        wx/unix/stackwalk.h 
   3 // Purpose:     declaration of wxStackWalker for Unix 
   4 // Author:      Vadim Zeitlin 
   8 // Copyright:   (c) 2005 Vadim Zeitlin <vadim@wxwindows.org> 
   9 // Licence:     wxWindows licence 
  10 /////////////////////////////////////////////////////////////////////////////// 
  12 #ifndef _WX_UNIX_STACKWALK_H_ 
  13 #define _WX_UNIX_STACKWALK_H_ 
  15 // ---------------------------------------------------------------------------- 
  17 // ---------------------------------------------------------------------------- 
  19 class WXDLLIMPEXP_BASE wxStackFrame 
: public wxStackFrameBase
 
  21     friend class wxStackWalker
; 
  24     // arguments are the stack depth of this frame, its address and the return 
  25     // value of backtrace_symbols() for it 
  27     // NB: we don't copy syminfo pointer so it should have lifetime at least as 
  29     wxStackFrame(size_t level 
= 0, void *address 
= NULL
, const char *syminfo 
= NULL
) 
  30         : wxStackFrameBase(level
, address
) 
  36     virtual void OnGetName(); 
  38     // optimized for the 2 step initialization done by wxStackWalker 
  39     void Set(const wxString 
&name
, const wxString 
&filename
, const char* syminfo
, 
  40              size_t level
, size_t numLine
, void *address
) 
  44         m_filename 
= filename
; 
  52     const char *m_syminfo
; 
  55 // ---------------------------------------------------------------------------- 
  57 // ---------------------------------------------------------------------------- 
  59 class WXDLLIMPEXP_BASE wxStackWalker 
: public wxStackWalkerBase
 
  62     // we need the full path to the program executable to be able to use 
  63     // addr2line, normally we can retrieve it from wxTheApp but if wxTheApp 
  64     // doesn't exist or doesn't have the correct value, the path may be given 
  66     wxStackWalker(const char *argv0 
= NULL
) 
  68         ms_exepath 
= wxString::FromAscii(argv0
); 
  76     virtual void Walk(size_t skip 
= 1, size_t maxDepth 
= wxSTACKWALKER_MAX_DEPTH
); 
  77 #if wxUSE_ON_FATAL_EXCEPTION 
  78     virtual void WalkFromException(size_t maxDepth 
= wxSTACKWALKER_MAX_DEPTH
) { Walk(2, maxDepth
); } 
  79 #endif // wxUSE_ON_FATAL_EXCEPTION 
  81     static const wxString
& GetExePath() { return ms_exepath
; } 
  84     // these two may be used to save the stack at some point (fast operation) 
  85     // and then process it later (slow operation) 
  86     void SaveStack(size_t maxDepth
); 
  87     void ProcessFrames(size_t skip
); 
  91     int InitFrames(wxStackFrame 
*arr
, size_t n
, void **addresses
, char **syminfo
); 
  93     static wxString ms_exepath
; 
  94     static void *ms_addresses
[]; 
  95     static char **ms_symbols
; 
  99 #endif // _WX_UNIX_STACKWALK_H_