1/////////////////////////////////////////////////////////////////////////////// 2// Name: wx/msw/stackwalk.h 3// Purpose: wxStackWalker for MSW 4// Author: Vadim Zeitlin 5// Modified by: 6// Created: 2005-01-08 7// RCS-ID: $Id: stackwalk.h 43346 2006-11-12 14:33:03Z RR $ 8// Copyright: (c) 2005 Vadim Zeitlin <vadim@wxwindows.org> 9// Licence: wxWindows licence 10/////////////////////////////////////////////////////////////////////////////// 11 12#ifndef _WX_MSW_STACKWALK_H_ 13#define _WX_MSW_STACKWALK_H_ 14 15#include "wx/arrstr.h" 16 17// these structs are declared in windows headers 18struct _CONTEXT; 19struct _EXCEPTION_POINTERS; 20 21// and these in dbghelp.h 22struct _SYMBOL_INFO; 23 24// ---------------------------------------------------------------------------- 25// wxStackFrame 26// ---------------------------------------------------------------------------- 27 28class WXDLLIMPEXP_BASE wxStackFrame : public wxStackFrameBase 29{ 30private: 31 wxStackFrame *ConstCast() const 32 { return wx_const_cast(wxStackFrame *, this); } 33 34 size_t DoGetParamCount() const { return m_paramTypes.GetCount(); } 35 36public: 37 wxStackFrame(size_t level, void *address, size_t addrFrame) 38 : wxStackFrameBase(level, address) 39 { 40 m_hasName = 41 m_hasLocation = false; 42 43 m_addrFrame = addrFrame; 44 } 45 46 virtual size_t GetParamCount() const 47 { 48 ConstCast()->OnGetParam(); 49 return DoGetParamCount(); 50 } 51 52 virtual bool 53 GetParam(size_t n, wxString *type, wxString *name, wxString *value) const; 54 55 // callback used by OnGetParam(), don't call directly 56 void OnParam(_SYMBOL_INFO *pSymInfo); 57 58protected: 59 virtual void OnGetName(); 60 virtual void OnGetLocation(); 61 62 void OnGetParam(); 63 64 65 // helper for debug API: it wants to have addresses as DWORDs 66 size_t GetSymAddr() const 67 { 68 return wx_reinterpret_cast(size_t, m_address); 69 } 70 71private: 72 bool m_hasName, 73 m_hasLocation; 74 75 size_t m_addrFrame; 76 77 wxArrayString m_paramTypes, 78 m_paramNames, 79 m_paramValues; 80}; 81 82// ---------------------------------------------------------------------------- 83// wxStackWalker 84// ---------------------------------------------------------------------------- 85 86class WXDLLIMPEXP_BASE wxStackWalker : public wxStackWalkerBase 87{ 88public: 89 // we don't use ctor argument, it is for compatibility with Unix version 90 // only 91 wxStackWalker(const char * WXUNUSED(argv0) = NULL) { } 92 93 virtual void Walk(size_t skip = 1, size_t maxDepth = 200); 94 virtual void WalkFromException(); 95 96 97 // enumerate stack frames from the given context 98 void WalkFrom(const _CONTEXT *ctx, size_t skip = 1); 99 void WalkFrom(const _EXCEPTION_POINTERS *ep, size_t skip = 1); 100}; 101 102#endif // _WX_MSW_STACKWALK_H_ 103 104