///////////////////////////////////////////////////////////////////////////////
-// Name: wx/wx/stackwalk.h
+// Name: wx/stackwalk.h
// Purpose: wxStackWalker and related classes, common part
// Author: Vadim Zeitlin
// Modified by:
#if wxUSE_STACKWALKER
-class WXDLLIMPEXP_BASE wxStackFrame;
+class WXDLLIMPEXP_FWD_BASE wxStackFrame;
+
+#define wxSTACKWALKER_MAX_DEPTH (200)
// ----------------------------------------------------------------------------
// wxStackFrame: a single stack level
private:
// put this inline function here so that it is defined before use
wxStackFrameBase *ConstCast() const
- { return wx_const_cast(wxStackFrameBase *, this); }
+ { return const_cast<wxStackFrameBase *>(this); }
public:
wxStackFrameBase(size_t level, void *address = NULL)
// return the instruction pointer offset from the start of the function
size_t GetOffset() const { ConstCast()->OnGetName(); return m_offset; }
+ // get the module this function belongs to (not always available)
+ wxString GetModule() const { ConstCast()->OnGetName(); return m_module; }
+
// return true if we have the filename and line number for this frame
bool HasSourceLocation() const { return !GetFileName().empty(); }
size_t m_level;
wxString m_name,
+ m_module,
m_filename;
+
size_t m_line;
void *m_address;
// ctor does nothing, use Walk() to walk the stack
wxStackWalkerBase() { }
+ // dtor does nothing neither but should be virtual
+ virtual ~wxStackWalkerBase() { }
+
// enumerate stack frames from the current location, skipping the initial
// number of them (this can be useful when Walk() is called from some known
// location and you don't want to see the first few frames anyhow; also
// notice that Walk() frame itself is not included if skip >= 1)
- virtual void Walk(size_t skip = 1) = 0;
+ virtual void Walk(size_t skip = 1, size_t maxDepth = wxSTACKWALKER_MAX_DEPTH) = 0;
+#if wxUSE_ON_FATAL_EXCEPTION
// enumerate stack frames from the location of uncaught exception
//
// this version can only be called from wxApp::OnFatalException()
- virtual void WalkFromException() = 0;
+ virtual void WalkFromException(size_t maxDepth = wxSTACKWALKER_MAX_DEPTH) = 0;
+#endif // wxUSE_ON_FATAL_EXCEPTION
protected:
// this function must be overrided to process the given frame
#ifdef __WXMSW__
#include "wx/msw/stackwalk.h"
+#elif defined(__UNIX__)
+ #include "wx/unix/stackwalk.h"
+#else
+ #error "wxStackWalker is not supported, set wxUSE_STACKWALKER to 0"
#endif
#endif // wxUSE_STACKWALKER