]> git.saurik.com Git - wxWidgets.git/blame - docs/doxygen/overviews/debugging.h
Fix broken and missing DataView interface items for Phoenix
[wxWidgets.git] / docs / doxygen / overviews / debugging.h
CommitLineData
15b6757b 1/////////////////////////////////////////////////////////////////////////////
d54cf7ff 2// Name: debugging.h
15b6757b 3// Purpose: topic overview
7d9550df
VZ
4// Author: Vadim Zeitlin
5// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
15b6757b 6// RCS-ID: $Id$
526954c5 7// Licence: wxWindows licence
15b6757b
FM
8/////////////////////////////////////////////////////////////////////////////
9
880efa2a 10/**
36c9828f 11
928f1a07 12@page overview_debugging Debugging
36c9828f 13
ce154616
BP
14@tableofcontents
15
16Various classes, functions and macros are provided in wxWidgets to help you
17debug your application. Assertion macros allow you to insert various checks in
18your application which can be compiled out or disabled in release builds but
19are extremely useful while developing. Logging functions are also provided
20which are useful for inserting traces into your application code as well as
21debugging. Both assertions and debug logging are also used by wxWidgets itself
22so you may encounter them even if you don't use either of these features
23yourself.
24
25@see wxLog, @ref group_funcmacro_log, @ref group_funcmacro_debug
d54cf7ff 26
7d9550df
VZ
27
28
ce154616 29@section overview_debugging_config Configuring Debug Support
7d9550df
VZ
30
31Starting with wxWidgets 2.9.1 debugging features are always available by
32default (and not only in a special "debug" build of the library) and you need
33to predefine wxDEBUG_LEVEL symbol as 0 when building both the library and your
34application to remove them completely from the generated object code. However
35the debugging features are disabled by default when the application itself is
36built with @c NDEBUG defined (i.e. in "release" or "production" mode) so there
37is no need to do this, unless the resources of the system your application will
38be running on are unusually constrained (notice that when asserts are disabled
39their condition is not even evaluated so the only run-time cost is a single
40condition check and the extra space taken by the asserts in the code).
41
42This automatic deactivation of debugging code is done by IMPLEMENT_APP() macro
43so if you don't use you may need to explicitly call wxDISABLE_DEBUG_SUPPORT()
44yourself.
45
46Also notice that it is possible to build your own application with a different
47value of wxDEBUG_LEVEL than the one which was used for wxWidgets itself. E.g.
ce154616
BP
48you may be using an official binary version of the library which will have been
49compiled with default @code wxDEBUG_LEVEL == 1 @endcode but still predefine
7d9550df
VZ
50wxDEBUG_LEVEL as 0 for your own code.
51
52On the other hand, if you do want to keep the asserts even in production
53builds, you will probably want to override the handling of assertion failures
54as the default behaviour which pops up a message box notifying the user about
55the problem is usually inappropriate. Use wxSetAssertHandler() to set up your
56own custom function which should be called instead of the standard assertion
57failure handler. Such function could log an appropriate message in the
58application log file or maybe notify the user about the problem in some more
59user-friendly way.
60
61
ce154616
BP
62
63@section overview_debugging_dbgmacros Assertion Macros
7d9550df
VZ
64
65wxASSERT(), wxFAIL(), wxCHECK() as well as their other variants (see @ref
66group_funcmacro_debug) are similar to the standard assert() macro but are more
67flexible and powerful. The first of them is equivalent to assert() itself, i.e.
68it simply checks a condition and does nothing if it is true. The second one is
69equivalent to checking an always false condition and is supposed to be used for
70code paths which are supposed to be inaccessible (e.g. @c default branch of a
71@c switch statement which should never be executed). Finally, the wxCHECK()
72family of macros verifies the condition just as wxASSERT() does and performs
73some action such returning from the function if it fails -- thus, it is useful
74for checking the functions preconditions.
75
76All of the above functions exist in @c _MSG variants which allow you to provide
77a custom message which will be shown (or, more generally, passed to the assert
78handler) if the assertion fails, in addition to the usual file and line number
79information and the condition itself.
80
81Example of using an assertion macro:
928f1a07 82@code
7d9550df 83void GetTheAnswer(int *p)
928f1a07 84{
7d9550df 85 wxCHECK_RET( p, "pointer can't be NULL in GetTheAnswer()" );
36c9828f 86
7d9550df 87 *p = 42;
928f1a07
FM
88};
89@endcode
36c9828f 90
7d9550df
VZ
91If the condition is false, i.e. @c p is @NULL, the assertion handler is called
92and, in any case (even when wxDEBUG_LEVEL is 0), the function returns without
93dereferencing the NULL pointer on the next line thus avoiding a crash.
94
95The default assertion handler behaviour depends on whether the application
96using wxWidgets was compiled in release build (with @c NDEBUG defined) or debug
97one (without) but may be changed in either case as explained above. If it
98wasn't changed, then nothing will happen in the release build and a message box
99showing the information about the assert as well as allowing to stop the
100program, ignore future asserts or break into the debugger is shown. On the
101platforms where wxStackWalker is supported the message box will also show the
102stack trace at the moment when the assert failed often allowing you to diagnose
103the problem without using the debugger at all. You can see an example of such
104message box in the @ref page_samples_except.
36c9828f
FM
105
106
36c9828f 107
ce154616 108@section overview_debugging_logging Logging Functions
d54cf7ff 109
ce154616
BP
110You can use the wxLogDebug and wxLogTrace functions to output debugging
111information in debug mode; it will do nothing for non-debugging code.
d54cf7ff 112
d54cf7ff 113*/