source: trunk/doc/src/development/debug.qdoc@ 651

Last change on this file since 651 was 651, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.2 sources.

  • Property svn:eol-style set to native
File size: 10.5 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the documentation of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42/*!
43 \page debug.html
44 \title Debugging Techniques
45
46 Here we present some useful hints to help you with debugging your
47 Qt-based software.
48
49 \tableofcontents
50
51 \section1 Configuring Qt for Debugging
52
53 When \l{Installation}{configuring Qt for installation}, it is possible
54 to ensure that it is built to include debug symbols that can make it
55 easier to track bugs in applications and libraries. However, on some
56 platforms, building Qt in debug mode will cause applications to be larger
57 than desirable.
58
59 \section2 Debugging in Mac OS X and Xcode
60
61 \section3 Debugging With/Without Frameworks
62
63 The basic stuff you need to know about debug libraries and
64 frameworks is found at developer.apple.com in:
65 \l{http://developer.apple.com/technotes/tn2004/tn2124.html#SECDEBUGLIB}
66 {Apple Technicle Note TN2124} Qt follows that.
67
68 When you build Qt, frameworks are built by default, and inside the
69 framework you will find both a release and a debug version (e.g.,
70 QtCore and QtCore_debug). If you pass the \c{-no-framework} flag
71 when you build Qt, two dylibs are built for each Qt library (e.g.,
72 libQtCore.4.dylib and libQtCore_debug.4.dylib).
73
74 What happens when you link depends on whether you use frameworks
75 or not. We don't see a compelling reason to recommend one over the
76 other.
77
78 \section4 With Frameworks:
79
80 Since the release and debug libraries are inside the framework,
81 the app is simply linked against the framework. Then when you run
82 in the debugger, you will get either the release version or the
83 debug version, depending on whether you set \c{DYLD_IMAGE_SUFFIX}.
84 If you don't set it, you get the release version by default (i.e.,
85 non _debug). If you set \c{DYLD_IMAGE_SUFFIX=_debug}, you get the
86 debug version.
87
88 \section4 Without Frameworks:
89
90 When you tell \e{qmake} to generate a Makefile with the debug
91 config, it will link against the _debug version of the libraries
92 and generate debug symbols for the app. Running this program in
93 GDB will then work like running GDB on other platforms, and you
94 will be able to trace inside Qt.
95
96 \section3 Debug Symbols and Size
97
98 The amount of space taken up by debug symbols generated by GCC can
99 be excessively large. However, with the release of Xcode 2.3 it is
100 now possible to use Dwarf symbols which take up a significantly
101 smaller amount of space. To enable this feature when configuring
102 Qt, pass the \c{-dwarf-2} option to the configure script.
103
104 This is not enabled by default because previous versions of Xcode
105 will not work with the compiler flag used to implement this
106 feature. Mac OS X 10.5 will use dwarf-2 symbols by default.
107
108 dwarf-2 symbols contain references to source code, so the size of
109 the final debug application should compare favorably to a release
110 build.
111
112 \omit
113 Although it is not necessary to build Qt with debug symbols to use the
114 other techniques described in this document, certain features are only
115 available when Qt is configured for debugging.
116 \endomit
117
118 \section1 Command Line Options Recognized by Qt
119
120 When you run a Qt application, you can specify several
121 command-line options that can help with debugging. These are
122 recognized by QApplication.
123
124 \table
125 \header \o Option \o Description
126 \row \o \c -nograb
127 \o The application should never grab \link QWidget::grabMouse()
128 the mouse\endlink or \link QWidget::grabKeyboard() the
129 keyboard \endlink. This option is set by default when the
130 program is running in the \c gdb debugger under Linux.
131 \row \o \c -dograb
132 \o Ignore any implicit or explicit \c{-nograb}. \c -dograb wins over
133 \c -nograb even when \c -nograb is last on the command line.
134 \row \o \c -sync
135 \o Runs the application in X synchronous mode. Synchronous mode
136 forces the X server to perform each X client request
137 immediately and not use buffer optimization. It makes the
138 program easier to debug and often much slower. The \c -sync
139 option is only valid for the X11 version of Qt.
140 \endtable
141
142 \section1 Warning and Debugging Messages
143
144 Qt includes four global functions for writing out warning and debug
145 text. You can use them for the following purposes:
146
147 \list
148 \o qDebug() is used for writing custom debug output.
149 \o qWarning() is used to report warnings and recoverable errors in
150 your application.
151 \o qCritical() is used for writing critical error mesages and
152 reporting system errors.
153 \o qFatal() is used for writing fatal error messages shortly before exiting.
154 \endlist
155
156 If you include the <QtDebug> header file, the \c qDebug() function
157 can also be used as an output stream. For example:
158
159 \snippet doc/src/snippets/code/doc_src_debug.qdoc 0
160
161 The Qt implementation of these functions prints the text to the
162 \c stderr output under Unix/X11 and Mac OS X. With Windows, if it
163 is a console application, the text is sent to console; otherwise, it
164 is sent to the debugger. You can take over these functions by
165 installing a message handler using qInstallMsgHandler().
166
167 If the \c QT_FATAL_WARNINGS environment variable is set,
168 qWarning() exits after printing the warning message. This makes
169 it easy to obtain a backtrace in the debugger.
170
171 Both qDebug() and qWarning() are debugging tools. They can be
172 compiled away by defining \c QT_NO_DEBUG_OUTPUT and \c
173 QT_NO_WARNING_OUTPUT during compilation.
174
175 The debugging functions QObject::dumpObjectTree() and
176 QObject::dumpObjectInfo() are often useful when an application
177 looks or acts strangely. More useful if you use \l{QObject::setObjectName()}{object names}
178 than not, but often useful even without names.
179
180 \section1 Providing Support for the qDebug() Stream Operator
181
182 You can implement the stream operator used by qDebug() to provide
183 debugging support for your classes. The class that implements the
184 stream is \c QDebug. The functions you need to know about in \c
185 QDebug are \c space() and \c nospace(). They both return a debug
186 stream; the difference between them is whether a space is inserted
187 between each item. Here is an example for a class that represents
188 a 2D coordinate.
189
190 \snippet doc/src/snippets/qdebug/qdebugsnippet.cpp 0
191
192 Integration of custom types with Qt's meta-object system is covered
193 in more depth in the \l{Creating Custom Qt Types} document.
194
195 \section1 Debugging Macros
196
197 The header file \c <QtGlobal> contains some debugging macros and
198 \c{#define}s.
199
200 Three important macros are:
201 \list
202 \o \l{Q_ASSERT()}{Q_ASSERT}(cond), where \c cond is a boolean
203 expression, writes the warning "ASSERT: '\e{cond}' in file xyz.cpp, line
204 234" and exits if \c cond is false.
205 \o \l{Q_ASSERT_X()}{Q_ASSERT_X}(cond, where, what), where \c cond is a
206 boolean expression, \c where a location, and \c what a message,
207 writes the warning: "ASSERT failure in \c{where}: '\c{what}', file xyz.cpp, line 234"
208 and exits if \c cond is false.
209 \o \l{Q_CHECK_PTR()}{Q_CHECK_PTR}(ptr), where \c ptr is a pointer.
210 Writes the warning "In file xyz.cpp, line 234: Out of memory" and
211 exits if \c ptr is 0.
212 \endlist
213
214 These macros are useful for detecting program errors, e.g. like this:
215
216 \snippet doc/src/snippets/code/doc_src_debug.qdoc 1
217
218 Q_ASSERT(), Q_ASSERT_X(), and Q_CHECK_PTR() expand to nothing if
219 \c QT_NO_DEBUG is defined during compilation. For this reason,
220 the arguments to these macro should not have any side-effects.
221 Here is an incorrect usage of Q_CHECK_PTR():
222
223 \snippet doc/src/snippets/code/doc_src_debug.qdoc 2
224
225 If this code is compiled with \c QT_NO_DEBUG defined, the code in
226 the Q_CHECK_PTR() expression is not executed and \e alloc returns
227 an unitialized pointer.
228
229 The Qt library contains hundreds of internal checks that will
230 print warning messages when a programming error is detected. We
231 therefore recommend that you use a debug version of Qt when
232 developing Qt-based software.
233
234 \section1 Common Bugs
235
236 There is one bug that is so common that it deserves mention here:
237 If you include the Q_OBJECT macro in a class declaration and
238 run \link moc.html the meta-object compiler\endlink (\c{moc}),
239 but forget to link the \c{moc}-generated object code into your
240 executable, you will get very confusing error messages. Any link
241 error complaining about a lack of \c{vtbl}, \c{_vtbl}, \c{__vtbl}
242 or similar is likely to be a result of this problem.
243*/
Note: See TracBrowser for help on using the repository browser.