blob: c85ef3cb11644b5060414ea2d88a869701d8200f [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 Lemberg7f74a522002-07-26 09:09:10 +00007There are several ways to enable debugging features in a FreeType 2
8builds. This is controlled through the definition of special macros
9located 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 Lemberg7f74a522002-07-26 09:09:10 +000014 #define this macro if you want to compile the FT_ERROR macro calls
Werner Lemberga16c4a72003-04-21 13:30:27 +000015 to print error messages during program execution. This will not
16 stop the program. Very useful to spot invalid fonts during
17 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 Lemberga16c4a72003-04-21 13:30:27 +000021 #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,
23 FT_TRACE2, ..., FT_TRACE6.
David Turner02c3aed2002-07-08 23:02:32 +000024
Werner Lemberg7f74a522002-07-26 09:09:10 +000025 The trace macros are used to send debugging messages when an
26 appropriate "debug level" is configured at runtime through the
27 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 Lemberga16c4a72003-04-21 13:30:27 +000031 If this macro is #defined, the FreeType engine is linked with a
Werner Lemberg7f74a522002-07-26 09:09:10 +000032 small but effective debugging memory manager that tracks all
33 allocations and frees that are performed within the font engine.
David Turner02c3aed2002-07-08 23:02:32 +000034
Werner Lemberg7f74a522002-07-26 09:09:10 +000035 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 locations
Werner Lemberga16c4a72003-04-21 13:30:27 +000038 where these were allocated. It is always a very good idea to define
Werner Lemberg7f74a522002-07-26 09:09:10 +000039 this in development builds. This works with _any_ program linked to
40 FreeType, but requires a big deal of memory (the debugging memory
41 manager never frees the blocks to the heap in order to detect double
42 frees).
David Turner02c3aed2002-07-08 23:02:32 +000043
44 When FT2_DEBUG_MEMORY isn't defined at runtime, the debugging memory
Werner Lemberga16c4a72003-04-21 13:30:27 +000045 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 Lemberg7f74a522002-07-26 09:09:10 +000051Several macros can be used within the FreeType sources to help debugging
52its code:
David Turner02c3aed2002-07-08 23:02:32 +000053
Werner Lemberg7f74a522002-07-26 09:09:10 +000054 1. FT_ERROR(( ... ))
David Turner02c3aed2002-07-08 23:02:32 +000055
Werner Lemberg7f74a522002-07-26 09:09:10 +000056 This macro is used to send debug messages that indicate relatively
57 serious errors (like broken font files), but will not stop the
58 execution of the running program. Its code is compiled only when
59 either FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined in
60 "ftoption.h".
David Turner02c3aed2002-07-08 23:02:32 +000061
Werner Lemberga16c4a72003-04-21 13:30:27 +000062 Note that you have to use a printf-like signature, but with double
Werner Lemberg7f74a522002-07-26 09:09:10 +000063 parentheses, like in:
David Turner02c3aed2002-07-08 23:02:32 +000064
Werner Lemberg7f74a522002-07-26 09:09:10 +000065 FT_ERROR(( "your %s is not %s\n", "foo", "bar" ));
David Turner02c3aed2002-07-08 23:02:32 +000066
67
Werner Lemberg7f74a522002-07-26 09:09:10 +000068 2. FT_ASSERT( condition )
David Turner02c3aed2002-07-08 23:02:32 +000069
Werner Lemberg7f74a522002-07-26 09:09:10 +000070 This macro is used to check strong assertions at runtime. If its
71 condition isn't TRUE, the program will abort with a panic message.
72 Its code is compiled when either FT_DEBUG_LEVEL_ERROR or
73 FT_DEBUG_LEVEL_TRACE are defined. You don't need double-parentheses
74 here. For example:
David Turner02c3aed2002-07-08 23:02:32 +000075
Werner Lemberg7f74a522002-07-26 09:09:10 +000076 FT_ASSERT( ptr != NULL );
David Turner02c3aed2002-07-08 23:02:32 +000077
78
Werner Lemberg7f74a522002-07-26 09:09:10 +000079 3. FT_TRACE( level, (message...) )
David Turner02c3aed2002-07-08 23:02:32 +000080
Werner Lemberg7f74a522002-07-26 09:09:10 +000081 The FT_TRACE macro is used to send general-purpose debugging
82 messages during program execution. This macro uses an *implicit*
83 macro named FT_COMPONENT used to name the current FreeType component
84 being run.
David Turner02c3aed2002-07-08 23:02:32 +000085
Werner Lemberg7f74a522002-07-26 09:09:10 +000086 The developer should always define FT_COMPONENT as appropriate, for
87 example as in:
David Turner02c3aed2002-07-08 23:02:32 +000088
Werner Lemberg7f74a522002-07-26 09:09:10 +000089 #undef FT_COMPONENT
90 #define FT_COMPONENT trace_io
David Turner02c3aed2002-07-08 23:02:32 +000091
Werner Lemberg7f74a522002-07-26 09:09:10 +000092 The value of the FT_COMPONENT macro is an enumeration named
93 trace_XXXX where XXXX is one of the component names defined in the
94 internal file <freetype/internal/fttrace.h>.
David Turner02c3aed2002-07-08 23:02:32 +000095
Werner Lemberga16c4a72003-04-21 13:30:27 +000096 Each such component is assigned a "debug level", ranging from 0
97 to 6, through the use of the FT2_DEBUG environment variable
98 (described below) when a program linked with FreeType starts.
David Turner02c3aed2002-07-08 23:02:32 +000099
Werner Lemberg7f74a522002-07-26 09:09:10 +0000100 When FT_TRACE is called, its level is compared to the one of the
101 corresponding component. Messages with trace levels *higher* than
102 the corresponding component level are filtered and never printed.
David Turner02c3aed2002-07-08 23:02:32 +0000103
Werner Lemberg7f74a522002-07-26 09:09:10 +0000104 This means that trace messages with level 0 are always printed,
105 those with level 2 are only printed when the component level is *at
106 least* 2.
David Turner02c3aed2002-07-08 23:02:32 +0000107
Werner Lemberg7f74a522002-07-26 09:09:10 +0000108 The second parameter to FT_TRACE must contain parentheses and
Werner Lemberga16c4a72003-04-21 13:30:27 +0000109 correspond to a printf-like call, as in:
David Turner02c3aed2002-07-08 23:02:32 +0000110
Werner Lemberg7f74a522002-07-26 09:09:10 +0000111 FT_TRACE( 2, ( "your %s is not %s\n", "foo", "bar" ) )
David Turner02c3aed2002-07-08 23:02:32 +0000112
Werner Lemberg7f74a522002-07-26 09:09:10 +0000113 The shortcut macros FT_TRACE0, FT_TRACE1, FT_TRACE2_, ... FT_TRACE6
114 can be used with constant level indices, and are much cleaner to
115 use, as in
David Turner02c3aed2002-07-08 23:02:32 +0000116
117 FT_TRACE2(( "your %s is not %s\n", "foo", "bar" ));
118
119
Werner Lemberg7f74a522002-07-26 09:09:10 +0000120III. Environment variables
121--------------------------
David Turner02c3aed2002-07-08 23:02:32 +0000122
Werner Lemberg7f74a522002-07-26 09:09:10 +0000123The following environment variables control debugging output and
124behaviour of FreeType at runtime:
David Turner02c3aed2002-07-08 23:02:32 +0000125
David Turner02c3aed2002-07-08 23:02:32 +0000126 FT2_DEBUG
David Turner02c3aed2002-07-08 23:02:32 +0000127
Werner Lemberg7f74a522002-07-26 09:09:10 +0000128 This variable is only used when FreeType is built with
129 FT_DEBUG_LEVEL_TRACE defined. It contains a list of component level
130 definitions, following this format:
131
132 component1:level1 component2:level2 component3:level3 ...
David Turner02c3aed2002-07-08 23:02:32 +0000133
134 where "componentX" is the name of a tracing component, as defined in
Werner Lemberga16c4a72003-04-21 13:30:27 +0000135 "fttrace.h", but without the "trace_" prefix. "levelX" is the
David Turner02c3aed2002-07-08 23:02:32 +0000136 corresponding level to use at runtime.
137
Werner Lemberg7f74a522002-07-26 09:09:10 +0000138 "any" is a special component name that will be interpreted as
139 "any/all components". For example, the following definitions
David Turner02c3aed2002-07-08 23:02:32 +0000140
141 set FT2_DEBUG=any:2 memory:5 io:4 (on Windows)
Werner Lemberga16c4a72003-04-21 13:30:27 +0000142 export FT2_DEBUG="any:2 memory:5 io:4" (on Linux with bash)
David Turner02c3aed2002-07-08 23:02:32 +0000143
Werner Lemberg7f74a522002-07-26 09:09:10 +0000144 both stipulate that all components should have level 2, except for
Werner Lemberga16c4a72003-04-21 13:30:27 +0000145 the memory and io components which will be set to trace levels 5
146 and 4, respectively.
David Turner02c3aed2002-07-08 23:02:32 +0000147
148 FT2_DEBUG_MEMORY
David Turner02c3aed2002-07-08 23:02:32 +0000149
Werner Lemberg7f74a522002-07-26 09:09:10 +0000150 This environment variable, when defined, tells FreeType to use a
Werner Lemberga16c4a72003-04-21 13:30:27 +0000151 debugging memory manager that will track leaking memory blocks as
Werner Lemberg7f74a522002-07-26 09:09:10 +0000152 well as other common errors like double frees. It is also capable
Werner Lemberga16c4a72003-04-21 13:30:27 +0000153 of reporting _where_ the leaking blocks were allocated, which
Werner Lemberg7f74a522002-07-26 09:09:10 +0000154 considerably saves time when debugging new additions to the library.
155
156 This code is only compiled when FreeType is built with the
157 FT_DEBUG_MEMORY macro #defined in "ftoption.h" though, it will be
158 ignored in other builds.
David Turner02c3aed2002-07-08 23:02:32 +0000159
David Turnerb2805372003-03-13 21:07:51 +0000160 FT2_ALLOC_TOTAL_MAX
161
Werner Lemberga16c4a72003-04-21 13:30:27 +0000162 This variable is ignored if FT2_DEBUG_MEMORY is not defined. It
163 allows you to specify a maximum heap size for all memory allocations
164 performed by FreeType. This is very useful to test the robustness
165 of the font engine and programs that use it in tight memory
166 conditions.
David Turnerb2805372003-03-13 21:07:51 +0000167
Werner Lemberga16c4a72003-04-21 13:30:27 +0000168 If it is undefined, or if its value is not strictly positive, then
169 no allocation bounds are checked at runtime.
David Turnerb2805372003-03-13 21:07:51 +0000170
171 FT2_ALLOC_COUNT_MAX
172
Werner Lemberga16c4a72003-04-21 13:30:27 +0000173 This variable is ignored if FT2_DEBUG_MEMORY is not defined. It
174 allows you to specify a maximum number of memory allocations
175 performed by FreeType before returning the error
176 FT_Err_Out_Of_Memory. This is useful for debugging and testing the
177 engine's robustness.
David Turnerb2805372003-03-13 21:07:51 +0000178
Werner Lemberga16c4a72003-04-21 13:30:27 +0000179 If it is undefined, or if its value is not strictly positive, then
180 no allocation bounsd are checked at runtime.
David Turnerb2805372003-03-13 21:07:51 +0000181
Werner Lemberga16c4a72003-04-21 13:30:27 +0000182
183--- end of DEBUG ---