debugging.h 5.2 KB

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