blob: ab2c769ac5224f232fabad5361ec8c6bb9c6a356 [file] [log] [blame]
Werner Lemberga16c4a72003-04-21 13:30:27 +00001Debugging within the FreeType sources
2=====================================
David Turner02c3aed2002-07-08 23:02:32 +00003
Werner Lemberg7f74a522002-07-26 09:09:10 +00004I. Configuration macros
5-----------------------
David Turner02c3aed2002-07-08 23:02:32 +00006
Werner Lembergfae38202013-11-13 08:55:46 +01007There are several ways to enable debugging features in a FreeType 2
8builds. This is controlled through the definition of special macros
Werner Lemberga7235262005-08-30 00:22:46 +00009located in the file `ftoptions.h'. The macros are:
David Turner02c3aed2002-07-08 23:02:32 +000010
11
Werner Lemberg7f74a522002-07-26 09:09:10 +000012 FT_DEBUG_LEVEL_ERROR
David Turner02c3aed2002-07-08 23:02:32 +000013
Werner Lembergfae38202013-11-13 08:55:46 +010014 #define this macro if you want to compile the FT_ERROR macro calls
15 to print error messages during program execution. This will not
16 stop the program. Very useful to spot invalid fonts during
Werner Lemberga16c4a72003-04-21 13:30:27 +000017 development and to code workarounds for them.
David Turner02c3aed2002-07-08 23:02:32 +000018
Werner Lemberg7f74a522002-07-26 09:09:10 +000019 FT_DEBUG_LEVEL_TRACE
David Turner02c3aed2002-07-08 23:02:32 +000020
Werner Lembergfae38202013-11-13 08:55:46 +010021 #define this macro if you want to compile both macros FT_ERROR and
22 FT_TRACE. This also includes the variants FT_TRACE0, FT_TRACE1,
Werner Lemberg1357c192004-09-04 06:55:32 +000023 FT_TRACE2, ..., FT_TRACE7.
David Turner02c3aed2002-07-08 23:02:32 +000024
Werner Lembergfae38202013-11-13 08:55:46 +010025 The trace macros are used to send debugging messages when an
26 appropriate `debug level' is configured at runtime through the
Werner Lemberg7f74a522002-07-26 09:09:10 +000027 FT2_DEBUG environment variable (more on this later).
David Turner02c3aed2002-07-08 23:02:32 +000028
Werner Lemberg7f74a522002-07-26 09:09:10 +000029 FT_DEBUG_MEMORY
David Turner02c3aed2002-07-08 23:02:32 +000030
Werner Lembergfae38202013-11-13 08:55:46 +010031 If this macro is #defined, the FreeType engine is linked with a
32 small but effective debugging memory manager that tracks all
Werner Lemberg7f74a522002-07-26 09:09:10 +000033 allocations and frees that are performed within the font engine.
David Turner02c3aed2002-07-08 23:02:32 +000034
Werner Lembergfae38202013-11-13 08:55:46 +010035 When the FT2_DEBUG_MEMORY environment variable is defined at
36 runtime, a call to FT_Done_FreeType will dump memory statistics,
37 including the list of leaked memory blocks with the source
38 locations where these were allocated. It is always a very good
39 idea to define this in development builds. This works with _any_
40 program linked to FreeType, but requires a big deal of memory (the
41 debugging memory manager never frees the blocks to the heap in
42 order to detect double frees).
David Turner02c3aed2002-07-08 23:02:32 +000043
Werner Lembergfae38202013-11-13 08:55:46 +010044 When FT2_DEBUG_MEMORY isn't defined at runtime, the debugging
45 memory manager is ignored, and performance is unaffected.
David Turner02c3aed2002-07-08 23:02:32 +000046
47
Werner Lemberg7f74a522002-07-26 09:09:10 +000048II. Debugging macros
49--------------------
David Turner02c3aed2002-07-08 23:02:32 +000050
Werner Lembergfae38202013-11-13 08:55:46 +010051Several macros can be used within the FreeType sources to help
52debugging its code:
David Turner02c3aed2002-07-08 23:02:32 +000053
Werner Lemberga7235262005-08-30 00:22:46 +000054
Werner Lemberg7f74a522002-07-26 09:09:10 +000055 1. FT_ERROR(( ... ))
David Turner02c3aed2002-07-08 23:02:32 +000056
Werner Lembergfae38202013-11-13 08:55:46 +010057 This macro is used to send debug messages that indicate relatively
58 serious errors (like broken font files), but will not stop the
59 execution of the running program. Its code is compiled only when
60 either FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined in
Werner Lemberga7235262005-08-30 00:22:46 +000061 `ftoption.h'.
David Turner02c3aed2002-07-08 23:02:32 +000062
Werner Lembergfae38202013-11-13 08:55:46 +010063 Note that you have to use a printf-like signature, but with double
Werner Lemberga7235262005-08-30 00:22:46 +000064 parentheses, like in
David Turner02c3aed2002-07-08 23:02:32 +000065
Werner Lemberg7f74a522002-07-26 09:09:10 +000066 FT_ERROR(( "your %s is not %s\n", "foo", "bar" ));
David Turner02c3aed2002-07-08 23:02:32 +000067
68
Werner Lemberg7f74a522002-07-26 09:09:10 +000069 2. FT_ASSERT( condition )
David Turner02c3aed2002-07-08 23:02:32 +000070
Werner Lembergfae38202013-11-13 08:55:46 +010071 This macro is used to check strong assertions at runtime. If its
72 condition isn't TRUE, the program will abort with a panic message.
73 Its code is compiled when either FT_DEBUG_LEVEL_ERROR or
74 FT_DEBUG_LEVEL_TRACE are defined. You don't need double
75 parentheses here. For example
David Turner02c3aed2002-07-08 23:02:32 +000076
Werner Lemberg7f74a522002-07-26 09:09:10 +000077 FT_ASSERT( ptr != NULL );
David Turner02c3aed2002-07-08 23:02:32 +000078
79
Werner Lemberg7f74a522002-07-26 09:09:10 +000080 3. FT_TRACE( level, (message...) )
Werner Lemberg9b774e22007-01-16 06:11:27 +000081
Werner Lembergfae38202013-11-13 08:55:46 +010082 The FT_TRACE macro is used to send general-purpose debugging
83 messages during program execution. This macro uses an *implicit*
84 macro named FT_COMPONENT used to name the current FreeType
85 component being run.
David Turner02c3aed2002-07-08 23:02:32 +000086
Werner Lembergfae38202013-11-13 08:55:46 +010087 The developer should always define FT_COMPONENT as appropriate,
88 for example as in
David Turner02c3aed2002-07-08 23:02:32 +000089
Werner Lemberg7f74a522002-07-26 09:09:10 +000090 #undef FT_COMPONENT
91 #define FT_COMPONENT trace_io
David Turner02c3aed2002-07-08 23:02:32 +000092
Werner Lembergfae38202013-11-13 08:55:46 +010093 The value of the FT_COMPONENT macro is an enumeration named
94 `trace_XXXX' where `XXXX' is one of the component names defined in
95 the internal file `internal/fttrace.h'. If you modify FreeType
96 source and insert new `trace_XXXX' macro, you must register it in
97 `fttrace.h'. If you insert or remove many trace macros, you can
98 check the undefined or the unused trace macro by
99 `src/tools/chktrcmp.py'.
David Turner02c3aed2002-07-08 23:02:32 +0000100
Werner Lembergfae38202013-11-13 08:55:46 +0100101 Each such component is assigned a `debug level', ranging from 0 to
102 7, through the use of the FT2_DEBUG environment variable
Werner Lemberga16c4a72003-04-21 13:30:27 +0000103 (described below) when a program linked with FreeType starts.
David Turner02c3aed2002-07-08 23:02:32 +0000104
Werner Lembergfae38202013-11-13 08:55:46 +0100105 When FT_TRACE is called, its level is compared to the one of the
106 corresponding component. Messages with trace levels *higher* than
Werner Lemberg7f74a522002-07-26 09:09:10 +0000107 the corresponding component level are filtered and never printed.
David Turner02c3aed2002-07-08 23:02:32 +0000108
Werner Lembergfae38202013-11-13 08:55:46 +0100109 This means that trace messages with level 0 are always printed,
110 those with level 2 are only printed when the component level is
111 *at least* 2.
David Turner02c3aed2002-07-08 23:02:32 +0000112
Werner Lembergfae38202013-11-13 08:55:46 +0100113 The second parameter to FT_TRACE must contain parentheses and
Werner Lemberga7235262005-08-30 00:22:46 +0000114 correspond to a printf-like call, as in
David Turner02c3aed2002-07-08 23:02:32 +0000115
Werner Lemberg7f74a522002-07-26 09:09:10 +0000116 FT_TRACE( 2, ( "your %s is not %s\n", "foo", "bar" ) )
David Turner02c3aed2002-07-08 23:02:32 +0000117
Werner Lembergfae38202013-11-13 08:55:46 +0100118 The shortcut macros FT_TRACE0, FT_TRACE1, FT_TRACE2, ...,
119 FT_TRACE7 can be used with constant level indices, and are much
120 cleaner to use, as in
David Turner02c3aed2002-07-08 23:02:32 +0000121
Werner Lembergfae38202013-11-13 08:55:46 +0100122 FT_TRACE2(( "your %s is not %s\n", "foo", "bar" ));
David Turner02c3aed2002-07-08 23:02:32 +0000123
124
Werner Lemberg7f74a522002-07-26 09:09:10 +0000125III. Environment variables
126--------------------------
David Turner02c3aed2002-07-08 23:02:32 +0000127
Werner Lembergfae38202013-11-13 08:55:46 +0100128The following environment variables control debugging output and
Werner Lemberga7235262005-08-30 00:22:46 +0000129behaviour of FreeType at runtime.
130
David Turner02c3aed2002-07-08 23:02:32 +0000131
David Turner02c3aed2002-07-08 23:02:32 +0000132 FT2_DEBUG
David Turner02c3aed2002-07-08 23:02:32 +0000133
Werner Lembergfae38202013-11-13 08:55:46 +0100134 This variable is only used when FreeType is built with
135 FT_DEBUG_LEVEL_TRACE defined. It contains a list of component
136 level definitions, following this format:
Werner Lemberg7f74a522002-07-26 09:09:10 +0000137
Werner Lembergfae38202013-11-13 08:55:46 +0100138 component1:level1 component2:level2 component3:level3 ...
David Turner02c3aed2002-07-08 23:02:32 +0000139
Werner Lembergfae38202013-11-13 08:55:46 +0100140 where `componentX' is the name of a tracing component, as defined
141 in `fttrace.h', but without the `trace_' prefix. `levelX' is the
David Turner02c3aed2002-07-08 23:02:32 +0000142 corresponding level to use at runtime.
143
Werner Lembergfae38202013-11-13 08:55:46 +0100144 `any' is a special component name that will be interpreted as
Werner Lemberga7235262005-08-30 00:22:46 +0000145 `any/all components'. For example, the following definitions
David Turner02c3aed2002-07-08 23:02:32 +0000146
Werner Lembergfae38202013-11-13 08:55:46 +0100147 set FT2_DEBUG=any:2 memory:5 io:4 (on Windows)
148 export FT2_DEBUG="any:2 memory:5 io:4" (on Linux with bash)
David Turner02c3aed2002-07-08 23:02:32 +0000149
Werner Lembergfae38202013-11-13 08:55:46 +0100150 both stipulate that all components should have level 2, except for
151 the memory and io components which will be set to trace levels 5
152 and 4, respectively.
Werner Lemberga7235262005-08-30 00:22:46 +0000153
David Turner02c3aed2002-07-08 23:02:32 +0000154
155 FT2_DEBUG_MEMORY
David Turner02c3aed2002-07-08 23:02:32 +0000156
Werner Lembergfae38202013-11-13 08:55:46 +0100157 This environment variable, when defined, tells FreeType to use a
158 debugging memory manager that will track leaking memory blocks as
159 well as other common errors like double frees. It is also capable
160 of reporting _where_ the leaking blocks were allocated, which
161 considerably saves time when debugging new additions to the
162 library.
Werner Lemberg7f74a522002-07-26 09:09:10 +0000163
Werner Lembergfae38202013-11-13 08:55:46 +0100164 This code is only compiled when FreeType is built with the
165 FT_DEBUG_MEMORY macro #defined in `ftoption.h' though, it will be
Werner Lemberg7f74a522002-07-26 09:09:10 +0000166 ignored in other builds.
David Turner02c3aed2002-07-08 23:02:32 +0000167
Werner Lemberga7235262005-08-30 00:22:46 +0000168
David Turnerb2805372003-03-13 21:07:51 +0000169 FT2_ALLOC_TOTAL_MAX
170
Werner Lembergfae38202013-11-13 08:55:46 +0100171 This variable is ignored if FT2_DEBUG_MEMORY is not defined. It
172 allows you to specify a maximum heap size for all memory
173 allocations performed by FreeType. This is very useful to test
174 the robustness of the font engine and programs that use it in
175 tight memory conditions.
Werner Lemberg9b774e22007-01-16 06:11:27 +0000176
Werner Lembergfae38202013-11-13 08:55:46 +0100177 If it is undefined, or if its value is not strictly positive, then
Werner Lemberga16c4a72003-04-21 13:30:27 +0000178 no allocation bounds are checked at runtime.
David Turnerb2805372003-03-13 21:07:51 +0000179
Werner Lemberga7235262005-08-30 00:22:46 +0000180
David Turnerb2805372003-03-13 21:07:51 +0000181 FT2_ALLOC_COUNT_MAX
Werner Lemberg9b774e22007-01-16 06:11:27 +0000182
Werner Lembergfae38202013-11-13 08:55:46 +0100183 This variable is ignored if FT2_DEBUG_MEMORY is not defined. It
184 allows you to specify a maximum number of memory allocations
185 performed by FreeType before returning the error
186 FT_Err_Out_Of_Memory. This is useful for debugging and testing
187 the engine's robustness.
Werner Lemberg9b774e22007-01-16 06:11:27 +0000188
Werner Lembergfae38202013-11-13 08:55:46 +0100189 If it is undefined, or if its value is not strictly positive, then
Werner Lemberga7235262005-08-30 00:22:46 +0000190 no allocation bounds are checked at runtime.
David Turnerb2805372003-03-13 21:07:51 +0000191
Werner Lemberg56c368c2005-06-04 23:00:25 +0000192------------------------------------------------------------------------
193
Werner Lembergf57fc592015-01-17 20:41:43 +0100194Copyright 2002-2015 by
Werner Lemberg56c368c2005-06-04 23:00:25 +0000195David Turner, Robert Wilhelm, and Werner Lemberg.
196
Werner Lemberga7235262005-08-30 00:22:46 +0000197This file is part of the FreeType project, and may only be used,
198modified, and distributed under the terms of the FreeType project
199license, LICENSE.TXT. By continuing to use, modify, or distribute this
200file you indicate that you have read the license and understand and
Werner Lemberg56c368c2005-06-04 23:00:25 +0000201accept it fully.
202
Werner Lemberga16c4a72003-04-21 13:30:27 +0000203
204--- end of DEBUG ---