]> git.saurik.com Git - wxWidgets.git/blame - include/wx/unix/stackwalk.h
Fix wxGTK compilation in wxUSE_MENUS==0 case.
[wxWidgets.git] / include / wx / unix / stackwalk.h
CommitLineData
eaff0f0d
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: wx/unix/stackwalk.h
3// Purpose: declaration of wxStackWalker for Unix
4// Author: Vadim Zeitlin
5// Modified by:
6// Created: 2005-01-19
7// RCS-ID: $Id$
8// Copyright: (c) 2005 Vadim Zeitlin <vadim@wxwindows.org>
9// Licence: wxWindows licence
10///////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_UNIX_STACKWALK_H_
13#define _WX_UNIX_STACKWALK_H_
14
15// ----------------------------------------------------------------------------
16// wxStackFrame
17// ----------------------------------------------------------------------------
18
19class WXDLLIMPEXP_BASE wxStackFrame : public wxStackFrameBase
20{
a82c2299
RR
21 friend class wxStackWalker;
22
eaff0f0d
VZ
23public:
24 // arguments are the stack depth of this frame, its address and the return
25 // value of backtrace_symbols() for it
26 //
27 // NB: we don't copy syminfo pointer so it should have lifetime at least as
28 // long as ours
a82c2299 29 wxStackFrame(size_t level = 0, void *address = NULL, const char *syminfo = NULL)
eaff0f0d
VZ
30 : wxStackFrameBase(level, address)
31 {
eaff0f0d
VZ
32 m_syminfo = syminfo;
33 }
34
35protected:
36 virtual void OnGetName();
a82c2299
RR
37
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)
41 {
42 m_level = level;
43 m_name = name;
44 m_filename = filename;
45 m_syminfo = syminfo;
46
47 m_line = numLine;
48 m_address = address;
49 }
eaff0f0d
VZ
50
51private:
52 const char *m_syminfo;
eaff0f0d
VZ
53};
54
55// ----------------------------------------------------------------------------
56// wxStackWalker
57// ----------------------------------------------------------------------------
58
59class WXDLLIMPEXP_BASE wxStackWalker : public wxStackWalkerBase
60{
61public:
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
65 // explicitly
14bdf093
VZ
66 wxStackWalker(const char *argv0 = NULL)
67 {
68 ms_exepath = wxString::FromAscii(argv0);
69 }
eaff0f0d 70
a82c2299
RR
71 ~wxStackWalker()
72 {
73 FreeStack();
74 }
75
52499582 76 virtual void Walk(size_t skip = 1, size_t maxDepth = wxSTACKWALKER_MAX_DEPTH);
4db307e1 77#if wxUSE_ON_FATAL_EXCEPTION
52499582 78 virtual void WalkFromException(size_t maxDepth = wxSTACKWALKER_MAX_DEPTH) { Walk(2, maxDepth); }
4db307e1 79#endif // wxUSE_ON_FATAL_EXCEPTION
eaff0f0d
VZ
80
81 static const wxString& GetExePath() { return ms_exepath; }
82
a82c2299
RR
83
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);
88 void FreeStack();
89
eaff0f0d 90private:
a82c2299
RR
91 int InitFrames(wxStackFrame *arr, size_t n, void **addresses, char **syminfo);
92
eaff0f0d 93 static wxString ms_exepath;
a82c2299
RR
94 static void *ms_addresses[];
95 static char **ms_symbols;
96 static int m_depth;
eaff0f0d
VZ
97};
98
99#endif // _WX_UNIX_STACKWALK_H_