X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/14bdf0939698a408c29d62d40c034d9f3b951951..a4f6fe43c33bd7933645d110ad2719871dab043d:/include/wx/unix/stackwalk.h diff --git a/include/wx/unix/stackwalk.h b/include/wx/unix/stackwalk.h index eb53fac59d..c26883b205 100644 --- a/include/wx/unix/stackwalk.h +++ b/include/wx/unix/stackwalk.h @@ -18,30 +18,38 @@ class WXDLLIMPEXP_BASE wxStackFrame : public wxStackFrameBase { + friend class wxStackWalker; + public: // arguments are the stack depth of this frame, its address and the return // value of backtrace_symbols() for it // // NB: we don't copy syminfo pointer so it should have lifetime at least as // long as ours - wxStackFrame(size_t level, void *address, const char *syminfo) + wxStackFrame(size_t level = 0, void *address = NULL, const char *syminfo = NULL) : wxStackFrameBase(level, address) { - m_hasName = - m_hasLocation = false; - m_syminfo = syminfo; } protected: virtual void OnGetName(); - virtual void OnGetLocation(); + + // optimized for the 2 step initialization done by wxStackWalker + void Set(const wxString &name, const wxString &filename, const char* syminfo, + size_t level, size_t numLine, void *address) + { + m_level = level; + m_name = name; + m_filename = filename; + m_syminfo = syminfo; + + m_line = numLine; + m_address = address; + } private: const char *m_syminfo; - - bool m_hasName, - m_hasLocation; }; // ---------------------------------------------------------------------------- @@ -60,13 +68,32 @@ public: ms_exepath = wxString::FromAscii(argv0); } - virtual void Walk(size_t skip = 1); - virtual void WalkFromException() { Walk(2); } + ~wxStackWalker() + { + FreeStack(); + } + + virtual void Walk(size_t skip = 1, size_t maxDepth = wxSTACKWALKER_MAX_DEPTH); +#if wxUSE_ON_FATAL_EXCEPTION + virtual void WalkFromException(size_t maxDepth = wxSTACKWALKER_MAX_DEPTH) { Walk(2, maxDepth); } +#endif // wxUSE_ON_FATAL_EXCEPTION static const wxString& GetExePath() { return ms_exepath; } + + // these two may be used to save the stack at some point (fast operation) + // and then process it later (slow operation) + void SaveStack(size_t maxDepth); + void ProcessFrames(size_t skip); + void FreeStack(); + private: + int InitFrames(wxStackFrame *arr, size_t n, void **addresses, char **syminfo); + static wxString ms_exepath; + static void *ms_addresses[]; + static char **ms_symbols; + static int m_depth; }; #endif // _WX_UNIX_STACKWALK_H_