blob: 3d6acd3bb0e02e0dde94c00c0a50d17e6068e56b [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
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 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,
Werner Lemberg1357c192004-09-04 06:55:32 +000023 FT_TRACE2, ..., FT_TRACE7.
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
Werner Lemberga7235262005-08-30 00:22:46 +000026 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 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 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 Lemberg7f74a522002-07-26 09:09:10 +000057 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 Lemberga16c4a72003-04-21 13:30:27 +000063 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 Lemberg7f74a522002-07-26 09:09:10 +000071 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
Werner Lemberga7235262005-08-30 00:22:46 +000074 FT_DEBUG_LEVEL_TRACE are defined. You don't need double parentheses
75 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 Lemberg7f74a522002-07-26 09:09:10 +000082 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 component
85 being run.
David Turner02c3aed2002-07-08 23:02:32 +000086
Werner Lemberg7f74a522002-07-26 09:09:10 +000087 The developer should always define FT_COMPONENT as appropriate, for
Werner Lemberga7235262005-08-30 00:22:46 +000088 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 Lemberg7f74a522002-07-26 09:09:10 +000093 The value of the FT_COMPONENT macro is an enumeration named
94 trace_XXXX where XXXX is one of the component names defined in the
suzuki toshiya313d4f42009-07-13 00:01:57 +090095 internal file `freetype/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 check
98 the undefined or the unused trace macro by src/tools/chktrcmp.py.
David Turner02c3aed2002-07-08 23:02:32 +000099
Werner Lemberga7235262005-08-30 00:22:46 +0000100 Each such component is assigned a `debug level', ranging from 0
101 to 7, through the use of the FT2_DEBUG environment variable
Werner Lemberga16c4a72003-04-21 13:30:27 +0000102 (described below) when a program linked with FreeType starts.
David Turner02c3aed2002-07-08 23:02:32 +0000103
Werner Lemberg7f74a522002-07-26 09:09:10 +0000104 When FT_TRACE is called, its level is compared to the one of the
105 corresponding component. Messages with trace levels *higher* than
106 the corresponding component level are filtered and never printed.
David Turner02c3aed2002-07-08 23:02:32 +0000107
Werner Lemberg7f74a522002-07-26 09:09:10 +0000108 This means that trace messages with level 0 are always printed,
109 those with level 2 are only printed when the component level is *at
110 least* 2.
David Turner02c3aed2002-07-08 23:02:32 +0000111
Werner Lemberg7f74a522002-07-26 09:09:10 +0000112 The second parameter to FT_TRACE must contain parentheses and
Werner Lemberga7235262005-08-30 00:22:46 +0000113 correspond to a printf-like call, as in
David Turner02c3aed2002-07-08 23:02:32 +0000114
Werner Lemberg7f74a522002-07-26 09:09:10 +0000115 FT_TRACE( 2, ( "your %s is not %s\n", "foo", "bar" ) )
David Turner02c3aed2002-07-08 23:02:32 +0000116
Werner Lemberga7235262005-08-30 00:22:46 +0000117 The shortcut macros FT_TRACE0, FT_TRACE1, FT_TRACE2, ..., FT_TRACE7
Werner Lemberg7f74a522002-07-26 09:09:10 +0000118 can be used with constant level indices, and are much cleaner to
119 use, as in
David Turner02c3aed2002-07-08 23:02:32 +0000120
121 FT_TRACE2(( "your %s is not %s\n", "foo", "bar" ));
122
123
Werner Lemberg7f74a522002-07-26 09:09:10 +0000124III. Environment variables
125--------------------------
David Turner02c3aed2002-07-08 23:02:32 +0000126
Werner Lemberg7f74a522002-07-26 09:09:10 +0000127The following environment variables control debugging output and
Werner Lemberga7235262005-08-30 00:22:46 +0000128behaviour of FreeType at runtime.
129
David Turner02c3aed2002-07-08 23:02:32 +0000130
David Turner02c3aed2002-07-08 23:02:32 +0000131 FT2_DEBUG
David Turner02c3aed2002-07-08 23:02:32 +0000132
Werner Lemberg7f74a522002-07-26 09:09:10 +0000133 This variable is only used when FreeType is built with
134 FT_DEBUG_LEVEL_TRACE defined. It contains a list of component level
135 definitions, following this format:
136
137 component1:level1 component2:level2 component3:level3 ...
David Turner02c3aed2002-07-08 23:02:32 +0000138
Werner Lemberga7235262005-08-30 00:22:46 +0000139 where `componentX' is the name of a tracing component, as defined in
140 `fttrace.h', but without the `trace_' prefix. `levelX' is the
David Turner02c3aed2002-07-08 23:02:32 +0000141 corresponding level to use at runtime.
142
Werner Lemberga7235262005-08-30 00:22:46 +0000143 `any' is a special component name that will be interpreted as
144 `any/all components'. For example, the following definitions
David Turner02c3aed2002-07-08 23:02:32 +0000145
146 set FT2_DEBUG=any:2 memory:5 io:4 (on Windows)
Werner Lemberga16c4a72003-04-21 13:30:27 +0000147 export FT2_DEBUG="any:2 memory:5 io:4" (on Linux with bash)
David Turner02c3aed2002-07-08 23:02:32 +0000148
Werner Lemberg7f74a522002-07-26 09:09:10 +0000149 both stipulate that all components should have level 2, except for
Werner Lemberga7235262005-08-30 00:22:46 +0000150 the memory and io components which will be set to trace levels 5 and
151 4, respectively.
152
David Turner02c3aed2002-07-08 23:02:32 +0000153
154 FT2_DEBUG_MEMORY
David Turner02c3aed2002-07-08 23:02:32 +0000155
Werner Lemberg7f74a522002-07-26 09:09:10 +0000156 This environment variable, when defined, tells FreeType to use a
Werner Lemberga16c4a72003-04-21 13:30:27 +0000157 debugging memory manager that will track leaking memory blocks as
Werner Lemberg7f74a522002-07-26 09:09:10 +0000158 well as other common errors like double frees. It is also capable
Werner Lemberga16c4a72003-04-21 13:30:27 +0000159 of reporting _where_ the leaking blocks were allocated, which
Werner Lemberg7f74a522002-07-26 09:09:10 +0000160 considerably saves time when debugging new additions to the library.
161
162 This code is only compiled when FreeType is built with the
Werner Lemberga7235262005-08-30 00:22:46 +0000163 FT_DEBUG_MEMORY macro #defined in `ftoption.h' though, it will be
Werner Lemberg7f74a522002-07-26 09:09:10 +0000164 ignored in other builds.
David Turner02c3aed2002-07-08 23:02:32 +0000165
Werner Lemberga7235262005-08-30 00:22:46 +0000166
David Turnerb2805372003-03-13 21:07:51 +0000167 FT2_ALLOC_TOTAL_MAX
168
Werner Lemberga16c4a72003-04-21 13:30:27 +0000169 This variable is ignored if FT2_DEBUG_MEMORY is not defined. It
170 allows you to specify a maximum heap size for all memory allocations
171 performed by FreeType. This is very useful to test the robustness
172 of the font engine and programs that use it in tight memory
173 conditions.
Werner Lemberg9b774e22007-01-16 06:11:27 +0000174
Werner Lemberga16c4a72003-04-21 13:30:27 +0000175 If it is undefined, or if its value is not strictly positive, then
176 no allocation bounds are checked at runtime.
David Turnerb2805372003-03-13 21:07:51 +0000177
Werner Lemberga7235262005-08-30 00:22:46 +0000178
David Turnerb2805372003-03-13 21:07:51 +0000179 FT2_ALLOC_COUNT_MAX
Werner Lemberg9b774e22007-01-16 06:11:27 +0000180
Werner Lemberga16c4a72003-04-21 13:30:27 +0000181 This variable is ignored if FT2_DEBUG_MEMORY is not defined. It
182 allows you to specify a maximum number of memory allocations
183 performed by FreeType before returning the error
184 FT_Err_Out_Of_Memory. This is useful for debugging and testing the
185 engine's robustness.
Werner Lemberg9b774e22007-01-16 06:11:27 +0000186
Werner Lemberga16c4a72003-04-21 13:30:27 +0000187 If it is undefined, or if its value is not strictly positive, then
Werner Lemberga7235262005-08-30 00:22:46 +0000188 no allocation bounds are checked at runtime.
David Turnerb2805372003-03-13 21:07:51 +0000189
Werner Lemberg56c368c2005-06-04 23:00:25 +0000190------------------------------------------------------------------------
191
suzuki toshiya313d4f42009-07-13 00:01:57 +0900192Copyright 2002, 2003, 2004, 2005, 2009 by
Werner Lemberg56c368c2005-06-04 23:00:25 +0000193David Turner, Robert Wilhelm, and Werner Lemberg.
194
Werner Lemberga7235262005-08-30 00:22:46 +0000195This file is part of the FreeType project, and may only be used,
196modified, and distributed under the terms of the FreeType project
197license, LICENSE.TXT. By continuing to use, modify, or distribute this
198file you indicate that you have read the license and understand and
Werner Lemberg56c368c2005-06-04 23:00:25 +0000199accept it fully.
200
Werner Lemberga16c4a72003-04-21 13:30:27 +0000201
202--- end of DEBUG ---