X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/eaff0f0d3f7828c2acd9ebde4979acc0b3fa43b5..14619f10b0bdb630206607abd0ce0319d45e095a:/include/wx/unix/stackwalk.h?ds=inline diff --git a/include/wx/unix/stackwalk.h b/include/wx/unix/stackwalk.h index 77aebf52f3..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; }; // ---------------------------------------------------------------------------- @@ -55,15 +63,37 @@ public: // addr2line, normally we can retrieve it from wxTheApp but if wxTheApp // doesn't exist or doesn't have the correct value, the path may be given // explicitly - wxStackWalker(const char *argv0 = NULL) { ms_exepath = argv0; } + wxStackWalker(const char *argv0 = NULL) + { + ms_exepath = wxString::FromAscii(argv0); + } + + ~wxStackWalker() + { + FreeStack(); + } - virtual void Walk(size_t skip = 1); - virtual void WalkFromException() { Walk(2); } + 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_