2011-09-27 11:52:34 +02:00
|
|
|
/****************************************************************************
|
|
|
|
|
**
|
2014-01-07 13:27:11 +01:00
|
|
|
** Copyright (c) 2014 Digia Plc and/or its subsidiary(-ies).
|
2012-10-02 09:12:39 +02:00
|
|
|
** Contact: http://www.qt-project.org/legal
|
2011-09-27 11:52:34 +02:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** This file is part of Qt Creator
|
2011-09-27 11:52:34 +02:00
|
|
|
**
|
|
|
|
|
**
|
|
|
|
|
** GNU Free Documentation License
|
|
|
|
|
**
|
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU Free
|
|
|
|
|
** Documentation License version 1.3 as published by the Free Software
|
|
|
|
|
** Foundation and appearing in the file included in the packaging of this
|
|
|
|
|
** file.
|
|
|
|
|
**
|
|
|
|
|
**
|
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
// NOTE: the sections are not ordered by their logical order to avoid
|
|
|
|
|
// reshuffling the file each time the index order changes (i.e., often).
|
|
|
|
|
// Run the fixnavi.pl script to adjust the links to the index order.
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\contentspage index.html
|
2011-12-13 11:52:47 +01:00
|
|
|
\previouspage creator-testing.html
|
2011-09-27 11:52:34 +02:00
|
|
|
\page creator-debugging.html
|
2012-04-16 15:09:32 +02:00
|
|
|
\nextpage creator-debugger-engines.html
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\title Debugging
|
|
|
|
|
|
|
|
|
|
\QC provides a debugger plugin that acts as an interface between the \QC
|
|
|
|
|
core and external native debuggers such as the GNU Symbolic Debugger (GDB),
|
2013-10-31 11:40:06 +01:00
|
|
|
the Microsoft Console Debugger (CDB), a QML/JavaScript debugger, and the
|
|
|
|
|
debugger of the low level virtual machine (LLVM) project, LLDB.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \l{Setting Up Debugger}
|
2012-01-05 16:11:09 +01:00
|
|
|
|
2012-04-02 22:47:01 +02:00
|
|
|
The debugger plugin automatically selects a suitable
|
2013-10-31 11:40:06 +01:00
|
|
|
native debugger for each \l{glossary-buildandrun-kit}{kit} from the
|
|
|
|
|
ones found on your system. You can edit the kits to override this
|
|
|
|
|
choice.
|
2012-01-05 16:11:09 +01:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \l{Launching the Debugger}
|
2011-12-13 11:52:47 +01:00
|
|
|
|
2012-04-02 22:47:01 +02:00
|
|
|
To start an application from an open project under the control
|
|
|
|
|
of a debugger, press the Debug button in the lower left corner
|
|
|
|
|
of the main view, or press \key{F5}. Other, less common start
|
|
|
|
|
options are available in the \gui{Debug} > \gui{Start Debugging}
|
|
|
|
|
menu.
|
2011-12-13 11:52:47 +01:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \l{Interacting with the Debugger}
|
2011-12-13 11:52:47 +01:00
|
|
|
|
2012-04-02 22:47:01 +02:00
|
|
|
You can use the tool views in the \gui Debug mode to inspect the
|
|
|
|
|
state of your application while debugging.
|
2011-12-13 11:52:47 +01:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \l{Using Debugging Helpers}
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2011-12-13 11:52:47 +01:00
|
|
|
\QC is able to show complex data types in a customized,
|
|
|
|
|
user-extensible manner. For this purpose, it takes advantage of
|
|
|
|
|
two technologies, collectively referred to as \e {debugging
|
|
|
|
|
helpers}. Using the debugging helpers is not essential for
|
2012-04-02 22:47:01 +02:00
|
|
|
debugging with \QC, but they provide you with a powerful
|
|
|
|
|
tool to quickly examine complex data.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \l{Debugging Qt Quick Projects}
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2012-04-02 22:47:01 +02:00
|
|
|
When debugging a Qt Quick application, you can inspect the state
|
2012-09-27 15:13:25 +02:00
|
|
|
of the application while debugging JavaScript functions. You can set
|
2011-12-13 11:52:47 +01:00
|
|
|
breakpoints, view call stack trace, and examine locals and
|
2012-09-27 15:13:25 +02:00
|
|
|
expressions. While the application is running, you can inspect QML
|
|
|
|
|
objects and user interfaces, as well as execute JavaScript
|
|
|
|
|
expressions.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \l{Debugging a C++ Example Application}
|
2012-04-02 22:47:01 +02:00
|
|
|
|
|
|
|
|
Illustrates how to debug C++ applications in \QC.
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \l{Debugging a Qt Quick Example Application}
|
2012-04-02 22:47:01 +02:00
|
|
|
|
|
|
|
|
Illustrates how to debug Qt Quick applications in \QC.
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \l{Troubleshooting Debugger}
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2011-12-13 11:52:47 +01:00
|
|
|
If you encounter problems while debugging, check for possible
|
|
|
|
|
solutions to them.
|
2011-09-27 11:52:34 +02:00
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\contentspage index.html
|
2012-04-16 15:09:32 +02:00
|
|
|
\previouspage creator-debugger-engines.html
|
2011-09-27 11:52:34 +02:00
|
|
|
\page creator-debugger-operating-modes.html
|
|
|
|
|
\nextpage creator-debug-mode.html
|
|
|
|
|
|
|
|
|
|
\title Launching the Debugger
|
|
|
|
|
|
2012-04-02 22:47:01 +02:00
|
|
|
To start an application from an open project under the control
|
|
|
|
|
of a debugger, press the \gui Debug button in the lower left corner
|
|
|
|
|
of the main view, or press \key{F5}.
|
|
|
|
|
|
2011-09-27 11:52:34 +02:00
|
|
|
\QC checks whether the compiled program is up-to-date, and rebuilds
|
2012-04-02 22:47:01 +02:00
|
|
|
and deploys it if the \gui{Always build project before deploying it} and
|
|
|
|
|
\gui{Always deploy before running} options are selected in the
|
|
|
|
|
\gui{Build and Run} options.
|
|
|
|
|
|
|
|
|
|
The debugger then takes over and starts the program with suitable
|
|
|
|
|
parameters.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2012-04-02 22:47:01 +02:00
|
|
|
\note Starting a C++ program in the debugger can take a long
|
2011-09-27 11:52:34 +02:00
|
|
|
time, typically in the range of several seconds to minutes if complex
|
|
|
|
|
features (like QtWebKit) are used.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\section1 Launching the Debugger in Different Modes
|
|
|
|
|
|
2012-04-02 22:47:01 +02:00
|
|
|
The debugger plugin can run the native debuggers in various operating
|
2012-08-14 09:35:13 +02:00
|
|
|
modes depending on where and how the debugged process is started and run.
|
|
|
|
|
Some of the modes are only available for a particular operating system or
|
2012-04-02 22:47:01 +02:00
|
|
|
platform.
|
|
|
|
|
|
|
|
|
|
In general, the \key{F5} and the \gui{Debug} button are set up in a way
|
2012-08-14 09:35:13 +02:00
|
|
|
to start the operating mode that is commonly used in a given context.
|
2012-04-02 22:47:01 +02:00
|
|
|
So if the current project is set up as a C++ application using
|
|
|
|
|
the MinGW toolchain targeting desktop Windows, the GDB engine will
|
2012-08-14 09:35:13 +02:00
|
|
|
be started in Start Internal mode. If the current project is a
|
2013-10-09 12:22:20 +02:00
|
|
|
QML application using C++ plugins,
|
2012-04-02 22:47:01 +02:00
|
|
|
a "mixed" QML/C++ engine will be started, with the C++ parts
|
|
|
|
|
being handled by GDB and GDB server remote debugging.
|
|
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
Change the run configuration
|
2012-04-02 22:47:01 +02:00
|
|
|
parameters (such as \gui{Run in Terminal}) in the run settings of the
|
|
|
|
|
project, or select options from the \gui{Debug} > \gui{Start Debugging}
|
2012-08-14 09:35:13 +02:00
|
|
|
menu to select other modes of operation.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2012-04-02 22:47:01 +02:00
|
|
|
The debugger can run in the following modes:
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \b{Start Internal} to debug applications developed inside
|
2012-08-14 09:35:13 +02:00
|
|
|
\QC such as a Qt based GUI application.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \b{Start External} to start and debug processes
|
2012-08-14 09:35:13 +02:00
|
|
|
without a proper \QC project setup, either locally or
|
|
|
|
|
on a remote machine.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \b{Attach} to debug processes already started and
|
2012-08-14 09:35:13 +02:00
|
|
|
running outside \QC, either locally or on a
|
|
|
|
|
remote machine.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \b{Core} to debug crashed processes on Unix.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \b{Post-mortem} to debug crashed processes on Windows.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
\section2 Launching in Start Internal Mode
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
Start Internal mode is the default start mode for most projects, including
|
2012-04-02 22:47:01 +02:00
|
|
|
all projects using a desktop Qt version and plain C++ projects.
|
|
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
If you need a console window to operate your application, for example because
|
|
|
|
|
it accepts console input from the user, go to \gui {Projects > Run
|
|
|
|
|
Settings} and select the \gui {Run in terminal} check box.
|
2012-04-02 22:47:01 +02:00
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
To launch the debugger in Start Internal mode, click the
|
|
|
|
|
\gui {Start Debugging} button for the active project.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
You can specify breakpoints before or after launching the debugger.
|
|
|
|
|
For more information, see \l{Setting Breakpoints}.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
\section2 Launching in Start External Mode
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
To run any executable already present on your local or a remote machine
|
|
|
|
|
without using a project, select \gui{Debug > Start Debugging
|
|
|
|
|
> Start and Debug External Application}.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
\section2 Launching in Attach Mode
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
To attach the debugger to an application already running on your
|
|
|
|
|
local or a remote machine, select
|
|
|
|
|
\gui {Debug > Start Debugging > Attach to Running Application},
|
2011-09-27 11:52:34 +02:00
|
|
|
and then select a process by its name or process ID to attach to.
|
|
|
|
|
|
2012-04-02 22:47:01 +02:00
|
|
|
While this mode does not strictly require a project to be opened in \QC,
|
|
|
|
|
it is beneficial to have open one, as it makes setting breakpoints
|
2012-09-21 16:05:58 +02:00
|
|
|
and stepping through the code easier.
|
2012-04-02 22:47:01 +02:00
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
You can specify breakpoints before or after attaching the
|
|
|
|
|
debugger to the application.
|
2012-04-02 22:47:01 +02:00
|
|
|
For more information, see \l{Setting Breakpoints}.
|
|
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
\section2 Launching in Core Mode
|
|
|
|
|
|
|
|
|
|
The Core mode is used to inspect \e {core} files (crash dumps) that are
|
|
|
|
|
generated from crashed processes on Linux and Unix systems if the system
|
|
|
|
|
is set up to allow this.
|
|
|
|
|
|
|
|
|
|
To enable the dumping of core files on a Unix system, enter the following
|
|
|
|
|
command in the shell from which the application will be launched:
|
|
|
|
|
|
|
|
|
|
\code
|
|
|
|
|
ulimit -c unlimited
|
|
|
|
|
\endcode
|
|
|
|
|
|
|
|
|
|
To launch the debugger in the core mode, select \gui{Debug > Start
|
2013-11-18 15:56:52 +01:00
|
|
|
Debugging > Load Core File}.
|
2012-08-14 09:35:13 +02:00
|
|
|
|
|
|
|
|
Also in this mode, using a properly configured project containing
|
|
|
|
|
the sources of the crashed program is not strictly necessary, but
|
|
|
|
|
helpful.
|
|
|
|
|
|
|
|
|
|
\section2 Launching in Post-Mortem Mode
|
|
|
|
|
|
|
|
|
|
The post-mortem mode is available only on Windows, if you have installed
|
|
|
|
|
the debugging tools for Windows.
|
|
|
|
|
|
|
|
|
|
The \QC installation program asks you whether you want to
|
|
|
|
|
register \QC as a post-mortem debugger. To change the setting, select
|
2013-11-18 16:05:51 +01:00
|
|
|
\gui Tools > \gui Options > \gui Debugger > \gui General > \gui {Use Qt
|
|
|
|
|
Creator for post-mortem debugging}.
|
2012-08-14 09:35:13 +02:00
|
|
|
|
|
|
|
|
You can launch the debugger in the post-mortem mode if an application
|
|
|
|
|
crashes on Windows. Click the \gui {Debug in \QC} button in the error
|
|
|
|
|
message that is displayed by the Windows operating system.
|
|
|
|
|
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
\section1 Remote Debugging
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2012-08-14 09:35:13 +02:00
|
|
|
\QC provides very easy access to remote debugging.
|
|
|
|
|
|
|
|
|
|
In general, the remote debugging setup consist of a probe running on the
|
|
|
|
|
remote machine and a counterpart running on the host side.
|
2012-04-02 22:47:01 +02:00
|
|
|
The probe is either integrated into the running process (e.g. for QML
|
|
|
|
|
debugging) or runs a separate process (e.g. when using GDB server
|
2012-08-22 13:27:25 +02:00
|
|
|
on embedded Linux). The host side typically
|
2012-06-05 11:34:58 +02:00
|
|
|
consists of \QC itself, often with the help of an external process, such as
|
|
|
|
|
GDB or CDB.
|
|
|
|
|
|
2012-04-02 22:47:01 +02:00
|
|
|
While this setup might look daunting, it is mostly invisible to
|
2012-08-14 09:35:13 +02:00
|
|
|
the user of \QC. To start debugging on a remote target with the
|
2012-09-03 17:50:37 +02:00
|
|
|
necessary helper processes running, select the corresponding
|
|
|
|
|
\l{glossary-buildandrun-kit}{kit} in
|
2013-11-18 15:57:53 +01:00
|
|
|
\gui{Projects > Build & Run}, and then select a function to start remote
|
|
|
|
|
debugging in the \gui{Debug > Start Debugging} menu.
|
2012-04-02 22:47:01 +02:00
|
|
|
|
|
|
|
|
Special use cases, such as attaching to a running process on the
|
|
|
|
|
target, might still require manual setup.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\section3 Using GDB
|
|
|
|
|
|
2012-04-02 22:47:01 +02:00
|
|
|
When debugging on a target supported by GDB server, a local GDB process
|
|
|
|
|
talks to a GDB server running on the remote machine that controls the
|
|
|
|
|
process to be debugged.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
The GDB server process is started on the remote machines by passing a port
|
|
|
|
|
number and the executable:
|
|
|
|
|
|
|
|
|
|
\code
|
|
|
|
|
gdbserver :1234 <executable>
|
|
|
|
|
\endcode
|
|
|
|
|
|
|
|
|
|
It then typically responds:
|
|
|
|
|
\code
|
|
|
|
|
Process bin/qtcreator created; pid = 5159
|
|
|
|
|
Listening on port 1234
|
|
|
|
|
\endcode
|
|
|
|
|
|
|
|
|
|
On the local machine that runs \QC:
|
|
|
|
|
|
|
|
|
|
\list 1
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Select \gui {Debug > Start Debugging > Attach to Remote
|
2012-04-02 22:47:01 +02:00
|
|
|
Debug Server}.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li In the \gui {Host and port} field, enter the name of the remote
|
2011-09-27 11:52:34 +02:00
|
|
|
machine and the port number to use.
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Select \gui{OK} to start debugging.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
\section3 Using CDB
|
|
|
|
|
|
|
|
|
|
In remote mode, the local CDB process talks to a CDB process that
|
|
|
|
|
runs on the remote machine. The process is started with special
|
|
|
|
|
command line options that switch it into server mode. The remote CDB
|
|
|
|
|
process must load the \QC CDB extension library that is shipped with
|
|
|
|
|
\QC:
|
|
|
|
|
|
|
|
|
|
\list 1
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Install the \e{Debugging Tools for Windows} on the remote machine.
|
2011-09-27 11:52:34 +02:00
|
|
|
The installation folder contains the CDB command line executable
|
|
|
|
|
(cdb.exe).
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Copy the \QC CDB extension library from the Qt installation
|
2011-09-27 11:52:34 +02:00
|
|
|
directory to the a new folder on the remote machine
|
|
|
|
|
(32 or 64 bit version depending on the version of the Debugging
|
|
|
|
|
Tools for Windows
|
|
|
|
|
used):
|
|
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \c {\lib\qtcreatorcdbext32\qtcreatorcdbext.dll} (32 bit)
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \c {\lib\qtcreatorcdbext64\qtcreatorcdbext.dll} (64 bit)
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Set the _NT_DEBUGGER_EXTENSION_PATH environment variable to point
|
2011-09-27 11:52:34 +02:00
|
|
|
to that folder.
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li To use TCP/IP as communication protocol, launch remote CDB as
|
2011-09-27 11:52:34 +02:00
|
|
|
follows:
|
|
|
|
|
|
|
|
|
|
\code
|
|
|
|
|
cdb.exe -server tcp:port=1234 <executable>
|
|
|
|
|
\endcode
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li On the local machine running \QC, select
|
2011-09-27 11:52:34 +02:00
|
|
|
\gui {Debug > Start Debugging > Attach to Remote CDB Session}
|
|
|
|
|
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li In the \gui Connection field enter the connection parameters.
|
2011-09-27 11:52:34 +02:00
|
|
|
For example, for TCP/IP:
|
|
|
|
|
|
|
|
|
|
\code
|
|
|
|
|
Server:Port
|
|
|
|
|
\endcode
|
|
|
|
|
|
|
|
|
|
If you chose some other protocol, specify one of the alternative
|
|
|
|
|
formats:
|
|
|
|
|
|
|
|
|
|
\code
|
|
|
|
|
tcp:server=Server,port=Port[,password=Password][,ipversion=6]
|
|
|
|
|
tcp:clicon=Server,port=Port[,password=Password][,ipversion=6]
|
|
|
|
|
npipe:server=Server,pipe=PipeName[,password=Password]
|
|
|
|
|
com:port=COMPort,baud=BaudRate,channel=COMChannel[,password=Password]
|
|
|
|
|
spipe:proto=Protocol,{certuser=Cert|machuser=Cert},server=Server,pipe=PipeName[,password=Password]
|
|
|
|
|
ssl:proto=Protocol,{certuser=Cert|machuser=Cert},server=Server,port=Socket[,password=Password]
|
|
|
|
|
ssl:proto=Protocol,{certuser=Cert|machuser=Cert},clicon=Server,port=Socket[,password=Password]
|
|
|
|
|
\endcode
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Click \gui{OK} to start debugging.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\contentspage index.html
|
|
|
|
|
\previouspage creator-debugger-operating-modes.html
|
|
|
|
|
\page creator-debug-mode.html
|
2012-04-16 15:09:32 +02:00
|
|
|
\nextpage creator-debugging-helpers.html
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\title Interacting with the Debugger
|
|
|
|
|
|
2011-12-13 11:52:47 +01:00
|
|
|
You can use the \QC \gui Debug mode to inspect the state of your application
|
|
|
|
|
while debugging. You can interact with the debugger in several ways,
|
|
|
|
|
including the following:
|
|
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Go through a program line-by-line or instruction-by-instruction.
|
2011-12-13 11:52:47 +01:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Interrupt running programs.
|
2011-12-13 11:52:47 +01:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Set breakpoints.
|
2011-12-13 11:52:47 +01:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Examine the contents of the call stack.
|
2011-12-13 11:52:47 +01:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Examine and modify contents of local and global variables.
|
2011-12-13 11:52:47 +01:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Examine and modify registers and memory contents of
|
2012-04-02 22:47:01 +02:00
|
|
|
the debugged program.
|
2011-12-13 11:52:47 +01:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Examine the list of loaded shared libraries.
|
2011-12-13 11:52:47 +01:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Disassemble sections of code.
|
2012-04-02 22:47:01 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Create snapshots of the current state of the debugged program
|
2011-12-13 11:52:47 +01:00
|
|
|
and re-examine them later.
|
|
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
\QC displays the raw information provided by the native debuggers in a clear
|
|
|
|
|
and concise manner with the goal to simplify the debugging process as much
|
|
|
|
|
as possible without losing the power of the native debuggers.
|
|
|
|
|
|
|
|
|
|
In addition to the generic IDE functionality provided by stack view, views
|
|
|
|
|
for locals and expressions, registers, and so on, \QC includes features to
|
|
|
|
|
make debugging Qt-based applications easy. The debugger plugin understands
|
|
|
|
|
the internal layout of several Qt classes, for example, QString, the Qt
|
|
|
|
|
containers, and most importantly QObject (and classes derived from it), as
|
|
|
|
|
well as most containers of the C++ Standard Library and some GCC extensions.
|
|
|
|
|
This deeper understanding is used to present objects of such classes in a
|
|
|
|
|
useful way.
|
|
|
|
|
|
|
|
|
|
\section1 Using the Debugger
|
|
|
|
|
|
2011-09-27 11:52:34 +02:00
|
|
|
In \gui Debug mode, you can use several views to interact with the
|
|
|
|
|
program you are debugging. The availability of views depends on whether
|
|
|
|
|
you are debugging C++ or QML. Frequently used views are shown by
|
|
|
|
|
default and rarely used ones are hidden. To change the default settings,
|
|
|
|
|
select \gui {Window > Views}, and then select views to display or hide.
|
2012-11-02 21:48:26 +01:00
|
|
|
Alternatively, you can enable or disable views from the context menu
|
|
|
|
|
of the title bar of any visible debugger view.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\image qtcreator-debugger-views.png "Debug mode views"
|
|
|
|
|
|
|
|
|
|
By default, the views are locked into place in the workspace. Select
|
|
|
|
|
\gui {Window > Views > Locked} to unlock the views. Drag and drop the
|
|
|
|
|
views into new positions on the screen. Drag view borders to resize the
|
|
|
|
|
views. The size and position of views are saved for future sessions. Select
|
|
|
|
|
\gui {Window > Views > Reset to Default Layout} to reset the views to
|
|
|
|
|
their original sizes and positions.
|
|
|
|
|
|
|
|
|
|
Once the program starts running under the control of the debugger, it
|
|
|
|
|
behaves and performs as usual. You can interrupt a running C++ program by
|
|
|
|
|
selecting \gui{Debug} > \gui {Interrupt}. The program is automatically
|
|
|
|
|
interrupted when a breakpoint is hit.
|
|
|
|
|
|
|
|
|
|
Once the program stops, \QC:
|
|
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Retrieves data representing the call stack at the program's current
|
2011-09-27 11:52:34 +02:00
|
|
|
position.
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Retrieves the contents of local variables.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Examines \gui Expressions.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Updates the \gui Registers, \gui Modules, and \gui Disassembler
|
2011-09-27 11:52:34 +02:00
|
|
|
views if you are debugging the C++ based applications.
|
|
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
You can use the \gui Debug mode views to examine the data in more detail.
|
|
|
|
|
|
|
|
|
|
You can use the following keyboard shortcuts:
|
|
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li To finish debugging, press \key{Shift+F5}.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li To execute a line of code as a whole, press \key{F10}.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li To step into a function or a subfunction, press \key{F11}.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li To continue running the program, press \key{F5}.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li To run to the selected function when you are stepping into a nested
|
2011-09-27 11:52:34 +02:00
|
|
|
function, press \key{Ctrl+F6}.
|
|
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
It is also possible to continue executing the program until the current
|
|
|
|
|
function completes or jump to an arbitrary position in the current function.
|
|
|
|
|
|
|
|
|
|
\section1 Setting Breakpoints
|
|
|
|
|
|
|
|
|
|
A breakpoint represents a position or sets of positions in the code that,
|
|
|
|
|
when executed, interrupts the program being debugged and passes the control
|
|
|
|
|
to you. You can then examine the state of the interrupted program, or
|
|
|
|
|
continue execution either line-by-line or continuously.
|
|
|
|
|
|
|
|
|
|
\QC shows breakpoints in the \gui{Breakpoints} view which is enabled
|
|
|
|
|
by default. The \gui{Breakpoints} view is also accessible when the debugger
|
|
|
|
|
and the program being debugged is not running.
|
|
|
|
|
|
|
|
|
|
\image qtcreator-debug-breakpoints.png "Breakpoints view"
|
|
|
|
|
|
|
|
|
|
You can associate breakpoints with:
|
|
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Source code files and lines
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Functions
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Addresses
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Throwing and catching exceptions
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Executing and forking processes
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Executing some system calls
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Changes in a block of memory at a particular address when a
|
2011-09-27 11:52:34 +02:00
|
|
|
program is running
|
|
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
The interruption of a program by a breakpoint can be restricted with
|
|
|
|
|
certain conditions.
|
|
|
|
|
|
2013-02-22 14:40:55 +01:00
|
|
|
You can set and delete breakpoints before the program starts running or
|
|
|
|
|
while it is running under the debugger's control. Breakpoints are saved
|
|
|
|
|
together with a session.
|
|
|
|
|
|
|
|
|
|
\section2 Adding Breakpoints
|
|
|
|
|
|
|
|
|
|
To add breakpoints:
|
|
|
|
|
|
|
|
|
|
\list 1
|
|
|
|
|
|
|
|
|
|
\li Add a new breakpoint in one of the following ways:
|
|
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
|
|
|
|
\li In the code editor, click the left margin or press \key F9
|
|
|
|
|
(\key F8 for Mac OS X) at a particular line you want the
|
|
|
|
|
program to stop.
|
|
|
|
|
|
|
|
|
|
\li In the \gui Breakpoints view, double-click in the empty
|
|
|
|
|
part of the view.
|
|
|
|
|
|
|
|
|
|
\li In the \gui Breakpoints view, select \gui {Add Breakpoint}
|
|
|
|
|
in the context menu.
|
|
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
\li In the \gui {Breakpoint type} field, select the location in the
|
|
|
|
|
program code where you want the program to stop. The other options
|
|
|
|
|
to specify depend on the selected location.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-22 14:40:55 +01:00
|
|
|
\image qtcreator-add-breakpoint.png "Add Breakpoints" dialog
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-22 14:40:55 +01:00
|
|
|
\li In the \gui Condition field, set the condition to be evaluated
|
|
|
|
|
before stopping at the breakpoint if the condition evaluates as
|
|
|
|
|
true.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-22 14:40:55 +01:00
|
|
|
\li In the \gui Ignore field, specify the number of times that the
|
|
|
|
|
breakpoint is ignored before the program stops.
|
|
|
|
|
|
|
|
|
|
\li In the \gui Commands field, specify the commands to execute when
|
|
|
|
|
the program stops; one command on a line. GDB executes the commands
|
|
|
|
|
in the order in which they are specified.
|
|
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
For more information on breakpoints, see
|
|
|
|
|
\l{http://sourceware.org/gdb/onlinedocs/gdb/Breakpoints.html#Breakpoints}
|
|
|
|
|
{Breakpoints, Watchpoints, and Catchpoints} in GDB documentation.
|
|
|
|
|
|
|
|
|
|
\section2 Moving Breakpoints
|
|
|
|
|
|
|
|
|
|
To move the breakpoint, drag and drop a breakpoint marker to another line.
|
|
|
|
|
|
|
|
|
|
\section2 Deleting Breakpoints
|
|
|
|
|
|
|
|
|
|
To delete breakpoints:
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-02-22 14:40:55 +01:00
|
|
|
\li Click the breakpoint marker in the text editor.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-22 14:40:55 +01:00
|
|
|
\li Select the breakpoint in the \gui Breakpoints view and press
|
2011-09-27 11:52:34 +02:00
|
|
|
\key{Delete}.
|
|
|
|
|
|
2013-02-22 14:40:55 +01:00
|
|
|
\li Select \gui{Delete Breakpoint} in the context menu in the
|
|
|
|
|
\gui Breakpoints view.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
\section2 Setting Data Breakpoints
|
|
|
|
|
|
2013-02-22 14:40:55 +01:00
|
|
|
A \e {data breakpoint} stops the program when data is read or written at the
|
|
|
|
|
specified address.
|
|
|
|
|
|
2011-09-27 11:52:34 +02:00
|
|
|
To set a data breakpoint at an address:
|
|
|
|
|
|
|
|
|
|
\list 1
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Right-click in the \gui Breakpoints view to open the context menu,
|
2011-09-27 11:52:34 +02:00
|
|
|
and select \gui {Add Breakpoint}.
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li In the \gui {Breakpoint type} field, select \gui {Break on data
|
2011-09-27 11:52:34 +02:00
|
|
|
access at fixed address}.
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li In the \gui Address field, specify the address of the memory block.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Select \gui OK.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
If the address is displayed in the \gui {Locals and Expressions} view, you
|
|
|
|
|
can select \gui {Add Data Breakpoint at Object's Address} in the context
|
|
|
|
|
menu to set the data breakpoint.
|
|
|
|
|
|
|
|
|
|
\section1 Viewing Call Stack Trace
|
|
|
|
|
|
|
|
|
|
When the program being debugged is interrupted, \QC displays the
|
|
|
|
|
nested function calls leading to the current position as a call stack
|
|
|
|
|
trace. This stack trace is built up from call stack frames, each
|
|
|
|
|
representing a particular function. For each function, \QC tries
|
|
|
|
|
to retrieve the file name and line number of the corresponding source
|
|
|
|
|
file. This data is shown in the \gui Stack view.
|
|
|
|
|
|
|
|
|
|
\image qtcreator-debug-stack.png
|
|
|
|
|
|
|
|
|
|
Since the call stack leading to the current position may originate or go
|
|
|
|
|
through code for which no debug information is available, not all stack
|
|
|
|
|
frames have corresponding source locations. Stack frames without
|
|
|
|
|
corresponding source locations are grayed out in the \gui{Stack} view.
|
|
|
|
|
|
|
|
|
|
If you click a frame with a known source location, the text editor
|
|
|
|
|
jumps to the corresponding location and updates the \gui{Locals and Expressions}
|
|
|
|
|
view, making it seem like the program was interrupted before entering the
|
|
|
|
|
function.
|
|
|
|
|
|
|
|
|
|
\section1 Locals and Expressions
|
|
|
|
|
|
|
|
|
|
Whenever a program stops under the control of the debugger, it retrieves
|
|
|
|
|
information about the topmost stack frame and displays it in the
|
|
|
|
|
\gui{Locals and Expressions} view. The \gui{Locals and Expressions} view
|
|
|
|
|
typically includes information about parameters of the function in that
|
|
|
|
|
frame as well as the local variables.
|
|
|
|
|
|
|
|
|
|
\image qtcreator-locals-expressions.png "Locals and Expressions view"
|
|
|
|
|
|
|
|
|
|
Compound variables of struct or class type are displayed as
|
|
|
|
|
expandable in the view. Expand entries to show
|
|
|
|
|
all members. Together with the display of value and type, you can
|
|
|
|
|
examine and traverse the low-level layout of object data.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\table
|
|
|
|
|
\row
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \b{Note:}
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\row
|
2013-02-06 08:50:23 +01:00
|
|
|
\li GDB, and therefore \QC's debugger works for optimized
|
2011-09-27 11:52:34 +02:00
|
|
|
builds on Linux and Mac OS X. Optimization can lead to
|
|
|
|
|
re-ordering of instructions or removal of some local variables,
|
|
|
|
|
causing the \gui{Locals and Expressions} view to show unexpected
|
|
|
|
|
data.
|
|
|
|
|
\row
|
2013-02-06 08:50:23 +01:00
|
|
|
\li The debug information provided by GCC does not include enough
|
2011-09-27 11:52:34 +02:00
|
|
|
information about the time when a variable is initialized.
|
|
|
|
|
Therefore, \QC can not tell whether the contents of a
|
|
|
|
|
local variable contains "real data", or "initial noise". If a
|
|
|
|
|
QObject appears uninitialized, its value is reported as
|
|
|
|
|
\gui {not in scope}. Not all uninitialized objects, however, can be
|
|
|
|
|
recognized as such.
|
|
|
|
|
\endtable
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The \gui{Locals and Expressions} view also provides access to the most
|
|
|
|
|
powerful feature of the debugger: comprehensive display of data belonging
|
|
|
|
|
to Qt's basic objects.
|
|
|
|
|
For example, in case of QObject, instead of displaying a pointer to some
|
|
|
|
|
private data structure, you see a list of children, signals and slots.
|
|
|
|
|
|
|
|
|
|
Similarly, instead of displaying many pointers and integers, \QC's
|
|
|
|
|
debugger displays the contents of a QHash or QMap in an orderly manner.
|
|
|
|
|
Also, the debugger displays access data for QFileInfo and provides
|
|
|
|
|
access to the "real" contents of QVariant.
|
|
|
|
|
|
2012-10-15 12:37:33 +02:00
|
|
|
Right-click in the the \gui{Locals and Expressions} view to open a context
|
|
|
|
|
menu that provides additional options for viewing data. The available
|
|
|
|
|
options depend on the type of the current items, and are provided by the
|
|
|
|
|
\l{Using Debugging Helpers}{Debugging Helpers}. Typically, string-like data,
|
|
|
|
|
such as \c{QByteArray} and \c{std::string}, offer a selection of encodings,
|
|
|
|
|
as well as the possibility to use a full editor window. Map-like data, such
|
|
|
|
|
as \c{QMap}, \c{QHash}, and \c{std::map}, offer a compact option using the
|
|
|
|
|
\c{name} column for keys, resulting in a concise display of containers with
|
|
|
|
|
short keys, such as numbers or short strings. For example, to expand all the
|
|
|
|
|
values of QMap, select \gui {Change Local Display Format} > \gui Compact.
|
|
|
|
|
|
2011-09-27 11:52:34 +02:00
|
|
|
You can use the \gui{Locals and Expressions} view to change the contents of
|
2013-11-21 17:18:29 +01:00
|
|
|
variables of simple data types, for example, \c int, \c float, QString
|
|
|
|
|
and \c std::string when the
|
2011-09-27 11:52:34 +02:00
|
|
|
program is interrupted. To do so, click the \gui Value column, modify
|
|
|
|
|
the value with the inplace editor, and press \key Enter (or \key Return).
|
|
|
|
|
|
2013-11-21 17:18:29 +01:00
|
|
|
To change the complete contents of QVector or \c std::vector values,
|
|
|
|
|
type all values separated by commas into the \gui Value column of
|
|
|
|
|
the main entry.
|
|
|
|
|
|
2011-09-27 11:52:34 +02:00
|
|
|
You can enable tooltips in the main editor displaying this information.
|
|
|
|
|
For more information, see \l{Showing Tooltips in Debug Mode}.
|
|
|
|
|
|
|
|
|
|
\note The set of evaluated expressions is saved in your session.
|
|
|
|
|
|
|
|
|
|
\section1 Directly Interacting with Native Debuggers
|
|
|
|
|
|
|
|
|
|
In some cases, it is convenient to directly interact with the command
|
|
|
|
|
line of the native debugger. In \QC, you can use the left
|
|
|
|
|
pane of the \gui {Debugger Log} view for that purpose. When you press
|
2012-02-28 12:37:24 +01:00
|
|
|
\key {Ctrl+Enter}, the contents of the line under the text cursor
|
2011-09-27 11:52:34 +02:00
|
|
|
are sent directly to the native debugger. Alternatively, you
|
|
|
|
|
can use the line edit at the bottom of the view. Output is displayed in the
|
|
|
|
|
right pane of the \gui {Debugger Log} view.
|
|
|
|
|
|
|
|
|
|
\note Usually, you do not need this feature, because \QC provides
|
|
|
|
|
you with better ways to handle the task. For example, instead of using the
|
|
|
|
|
GDB \c print command from the command line, you can evaluate an expression
|
|
|
|
|
in the \gui{Locals and Expressions} view.
|
|
|
|
|
|
|
|
|
|
\section1 Debugging C++ Based Applications
|
|
|
|
|
|
|
|
|
|
The following sections describe additional debugging functions that apply
|
|
|
|
|
only to debugging C++.
|
|
|
|
|
|
|
|
|
|
\section2 Starting the Debugger from the Command Line
|
|
|
|
|
|
|
|
|
|
You can use the \QC debugger interface from the command line. To
|
|
|
|
|
attach it to a running process, specify the process ID as a parameter for
|
|
|
|
|
the \c {-debug} option. To examine a core file, specify the file name.
|
|
|
|
|
\QC executes all the necessary steps, such as searching for
|
2013-06-06 14:49:55 +02:00
|
|
|
the binary that belongs to a core file. To connect to a debug server,
|
|
|
|
|
specify the server location and port number.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \c {C:\qtcreator\bin>qtcreator -debug 2000}
|
2013-06-06 14:49:55 +02:00
|
|
|
\li \c {C:\qtcreator\bin>qtcreator -debug core=core.2000}
|
|
|
|
|
\li \c {C:\qtcreator\bin>qtcreator -debug some.exe,core=core}
|
|
|
|
|
\li \c {C:\qtcreator\bin>qtcreator -debug server=some.dot.com:4251}
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
For more information, see \l{Using Command Line Options}.
|
|
|
|
|
|
|
|
|
|
\section2 Stepping into Frameworks in Mac OS
|
|
|
|
|
|
|
|
|
|
In Mac OS X, external libraries are usually built into so-called Frameworks,
|
|
|
|
|
which may contain both release and debug versions of the library. When you run
|
|
|
|
|
applications on the Mac OS desktop, the release version of Frameworks is used
|
|
|
|
|
by default. To step into Frameworks, select the \gui {Use debug versions of
|
2012-09-03 17:50:37 +02:00
|
|
|
Frameworks} option in the project run settings.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\section2 Viewing Threads
|
|
|
|
|
|
2013-11-18 17:27:40 +01:00
|
|
|
If a multi-threaded program is interrupted, the \gui Threads view or the
|
|
|
|
|
combobox named \gui Threads in the debugger status bar can be used to
|
2011-09-27 11:52:34 +02:00
|
|
|
switch from one thread to another. The \gui Stack view adjusts itself
|
|
|
|
|
accordingly.
|
|
|
|
|
|
|
|
|
|
\section2 Viewing Modules
|
|
|
|
|
|
|
|
|
|
The \gui{Modules} view displays information that the debugger plugin has
|
|
|
|
|
about modules included in the application that is being debugged. A module
|
|
|
|
|
is a dynamic link library (.dll) in Windows, a shared object (.so) in
|
|
|
|
|
Linux, and a dynamic shared library (.dylib) in Mac OS.
|
|
|
|
|
|
|
|
|
|
In addition, the view displays symbols within the modules and indicates
|
|
|
|
|
where each module was loaded.
|
|
|
|
|
|
|
|
|
|
Right-click the view to open a context menu that contains menu items for:
|
|
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Updating the module list
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Loading symbols for modules
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Examining modules
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Editing module files
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Showing symbols in modules
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Showing dependencies between modules (Windows only)
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
By default, the \gui{Modules} view is hidden.
|
|
|
|
|
|
|
|
|
|
\section2 Viewing Source Files
|
|
|
|
|
|
|
|
|
|
The \gui{Source Files} view lists all the source files included in the project.
|
|
|
|
|
If you cannot step into an instruction, you can check whether the source file is
|
|
|
|
|
actually part of the project, or whether it was compiled
|
|
|
|
|
elsewhere. The view shows the path to each file in the file system.
|
|
|
|
|
|
|
|
|
|
Right-click the view to open a context menu that contains menu items for
|
|
|
|
|
reloading data and opening files.
|
|
|
|
|
|
|
|
|
|
By default, the \gui{Source Files} view is hidden.
|
|
|
|
|
|
|
|
|
|
\section2 Viewing Disassembled Code and Register State
|
|
|
|
|
|
|
|
|
|
The \gui{Disassembler} view displays disassembled code for the current
|
|
|
|
|
function. The \gui{Registers} view displays the current state of the CPU's
|
|
|
|
|
registers.
|
|
|
|
|
|
|
|
|
|
The \gui{Disassembler} view and the \gui{Registers} view are both useful
|
|
|
|
|
for low-level commands for checking single instructions, such as \gui{Step Into}
|
|
|
|
|
and \gui{Step Over}. By default, both \gui{Disassembler} and
|
|
|
|
|
\gui{Registers} view are hidden.
|
|
|
|
|
|
2012-11-02 21:48:26 +01:00
|
|
|
\section2 Creating Snapshots
|
|
|
|
|
|
|
|
|
|
A snapshot contains the complete state of the debugged program
|
|
|
|
|
at a time, including the full memory contents.
|
|
|
|
|
|
2013-11-18 17:28:46 +01:00
|
|
|
To create snapshots of a debugged program, select \gui {Create Snapshot} in
|
|
|
|
|
the context menu in the \gui Snapshots view.
|
2012-11-02 21:48:26 +01:00
|
|
|
|
2013-11-18 17:28:46 +01:00
|
|
|
Double-click on entries in the \gui Snapshots view to switch between
|
2012-11-02 21:48:26 +01:00
|
|
|
snapshots. The debugger views are updated to reflect the
|
|
|
|
|
state of the program at time of taking the snapshot.
|
|
|
|
|
|
2011-09-27 11:52:34 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\contentspage index.html
|
2012-04-16 15:09:32 +02:00
|
|
|
\previouspage creator-debug-mode.html
|
2011-09-27 11:52:34 +02:00
|
|
|
\page creator-debugging-helpers.html
|
|
|
|
|
\nextpage creator-debugging-qml.html
|
|
|
|
|
|
|
|
|
|
\title Using Debugging Helpers
|
|
|
|
|
|
2012-05-30 16:56:38 +02:00
|
|
|
Structured data, such as objects of \c class, \c struct, or \c union
|
|
|
|
|
types, is displayed in the \gui{Locals and Expressions} view as part
|
|
|
|
|
of a tree.
|
|
|
|
|
To access sub-structures of the objects, expand the tree nodes.
|
|
|
|
|
The sub-structures are presented in their in-memory order, unless
|
|
|
|
|
the \gui{Sort Members of Classes and Structs Alphabetically} option
|
|
|
|
|
from the context menu is selected.
|
|
|
|
|
|
|
|
|
|
Similarly, pointers are displayed as a tree item with a single child
|
|
|
|
|
item representing the target of the pointer. In case the
|
|
|
|
|
context menu item
|
|
|
|
|
\gui{Dereference Pointers Automatically} is selected, the pointer
|
|
|
|
|
and the target are combined into a single entry, showing the name
|
|
|
|
|
and the type of the pointer and the value of the target.
|
|
|
|
|
|
|
|
|
|
This standard representation is good enough for the examination
|
|
|
|
|
of simple structures, but it does usually not give enough insight into
|
|
|
|
|
more complex structures, such as \c QObjects or associative containers.
|
|
|
|
|
These items are internally represented by a complex arrangement of
|
|
|
|
|
pointers, often highly optimized, with part of the data not directly
|
|
|
|
|
accessible through either sub-structures or pointers.
|
|
|
|
|
|
|
|
|
|
To give the user simple access also to these items, \QC employs
|
|
|
|
|
so-called Debugging Helpers. Debugging Helpers come in two varieties,
|
|
|
|
|
compiled, and Python based, depending on the selected
|
2012-09-03 17:50:37 +02:00
|
|
|
\l{glossary-buildandrun-kit}{kit}.
|
2012-05-30 16:56:38 +02:00
|
|
|
|
|
|
|
|
By default, Debugging Helpers are automatically and transparently used.
|
|
|
|
|
To disable them, select \gui Tools > \gui Options > \gui Debugger >
|
|
|
|
|
\gui {Locals & Expressions}, and deselect the \gui{Use Debugging Helper}
|
|
|
|
|
check box.
|
|
|
|
|
|
|
|
|
|
\QC ships with Debugging Helpers for about 80 of the most
|
|
|
|
|
popular Qt classes, Standard C++ containers and smart pointers,
|
|
|
|
|
covering the usual needs of a C++ application developer out-of-the-box.
|
|
|
|
|
|
|
|
|
|
The following sections describe how to extend the debugging helpers
|
|
|
|
|
to your own data types.
|
|
|
|
|
|
|
|
|
|
|
2011-12-13 11:52:47 +01:00
|
|
|
There are two approaches to displaying complex data types. The first and
|
|
|
|
|
original one is to use debugging helpers based on C++. While it has been
|
|
|
|
|
superseded on most platforms by the more robust and more flexible second
|
|
|
|
|
approch that uses Python scripting, it is the only feasible one on
|
|
|
|
|
Windows/MSVC, Mac OS, and old Linux distributions. Moreover, this approach
|
|
|
|
|
is automatically chosen as fallback if the Python based approach fails.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\section1 Debugging Helpers Based on C++
|
|
|
|
|
|
|
|
|
|
During debugging with the C++ based debugging helpers,
|
|
|
|
|
\QC dynamically loads a helper library in form of a DLL or a
|
|
|
|
|
shared object into the debugged process.
|
|
|
|
|
The \QSDK package already contains a prebuilt debugging helper
|
2011-10-18 11:27:30 +02:00
|
|
|
library. To create your own debugging helper library, select \gui{Tools >
|
|
|
|
|
Options > Build & Run > Qt Versions}. As the internal data
|
2011-09-27 11:52:34 +02:00
|
|
|
structures of Qt can change between versions, the debugging helper
|
|
|
|
|
library is built for each Qt version.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\section1 Debugging Helpers Based on Python
|
|
|
|
|
|
|
|
|
|
\QC uses GDB builds that enable Python scripting to display
|
|
|
|
|
information in the \gui {Locals and Expressions} view. When Python scripting
|
|
|
|
|
is used, code (Debugging helpers) does not need to be injected into the
|
|
|
|
|
debugged process to nicely display QStringList or \c std::map contents, for
|
|
|
|
|
example.
|
|
|
|
|
|
|
|
|
|
The code injection caused problems and put an extra stress on the debugged
|
|
|
|
|
process. You can now easily extend the debugging helpers to other types. No
|
|
|
|
|
compilation is required, just adding a few lines of Python.
|
|
|
|
|
|
|
|
|
|
Python scripting vastly reduces the communication overhead compared
|
|
|
|
|
with the previous solution. However, there are some obstacles:
|
|
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li There is no Python-enabled GDB for Mac OS. Mac OS continues
|
2011-09-27 11:52:34 +02:00
|
|
|
injection with C++ based debugging helpers.
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li There is no GDB to communicate with MSVC compiled applications on
|
2011-09-27 11:52:34 +02:00
|
|
|
Windows. So information can be displayed nicely only in a limited
|
2013-11-21 11:30:42 +01:00
|
|
|
fashion by using a CDB extension DLL.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
\section2 Extending the Python Based Debugging Helpers
|
|
|
|
|
|
|
|
|
|
On platforms featuring a Python-enabled version of the GDB debugger,
|
|
|
|
|
the data extraction is done by a Python script. This is more robust
|
|
|
|
|
as the script execution is separated from the debugged process. It
|
|
|
|
|
is also easier to extend as the script is less dependent on the
|
|
|
|
|
actual Qt version and does not need compilation.
|
|
|
|
|
|
2012-11-17 15:22:36 +01:00
|
|
|
To extend the shipped Python based debugging helpers for custom
|
|
|
|
|
types, add debugging helper implementations to the GDB startup file
|
|
|
|
|
\c{~/.gdbinit}, or specify them directly in the \gui{Additional
|
|
|
|
|
Startup Commands} in \gui {Tools > Options > Debugger > GDB}.
|
|
|
|
|
|
|
|
|
|
The implementation of a debugging helper typically
|
|
|
|
|
consists of a single Python function, which needs to be named
|
|
|
|
|
\c{qdump__NS__Foo}, where \c{NS::Foo} is the class
|
|
|
|
|
or class template to be examined. Note that the \c{::} scope
|
|
|
|
|
resolution operator is replaced by double underscores \c{__}.
|
|
|
|
|
Nested namespaces are possible.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
The debugger plugin calls this function whenever you want to
|
|
|
|
|
display an object of this type. The function is passed the following
|
|
|
|
|
parameters:
|
|
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \c d of type \c Dumper
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li \c value of type \c gdb.Value
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
The function has to feed the Dumper object with certain information
|
|
|
|
|
which is used to build up the object and its children's display in the
|
|
|
|
|
\gui{Locals and Expressions} view.
|
|
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
|
|
\code
|
|
|
|
|
def qdump__QVector(d, value):
|
|
|
|
|
d_ptr = value["d"]
|
|
|
|
|
p_ptr = value["p"]
|
|
|
|
|
alloc = d_ptr["alloc"]
|
|
|
|
|
size = d_ptr["size"]
|
|
|
|
|
|
|
|
|
|
innerType = templateArgument(value.type, 0)
|
|
|
|
|
d.putItemCount(size)
|
|
|
|
|
d.putNumChild(size)
|
|
|
|
|
if d.isExpanded():
|
|
|
|
|
p = gdb.Value(p_ptr["array"]).cast(innerType.pointer())
|
|
|
|
|
charPtr = lookupType("char").pointer()
|
|
|
|
|
d.putField("size", size)
|
|
|
|
|
with Children(d, size, maxNumChild=2000, childType=innerType, addrBase=p,
|
|
|
|
|
addrStep=(p+1).cast(charPtr) - p.cast(charPtr)):
|
|
|
|
|
for i in d.childRange():
|
|
|
|
|
d.putSubItem(i, p.dereference())
|
|
|
|
|
p += 1
|
|
|
|
|
\endcode
|
|
|
|
|
|
|
|
|
|
\section2 Dumper Class
|
|
|
|
|
|
|
|
|
|
For each line in the \gui{Locals and Expressions} view, a string like the
|
|
|
|
|
following needs to be created and channeled to the debugger plugin.
|
|
|
|
|
\code
|
|
|
|
|
"{iname='some internal name', # optional
|
|
|
|
|
addr='object address in memory', # optional
|
|
|
|
|
name='contents of the name column', # optional
|
|
|
|
|
value='contents of the value column',
|
|
|
|
|
type='contents of the type column',
|
|
|
|
|
numchild='number of children', # zero/nonzero is sufficient
|
|
|
|
|
childtype='default type of children', # optional
|
|
|
|
|
childnumchild='default number of grandchildren', # optional
|
|
|
|
|
children=[ # only needed if item is expanded in view
|
|
|
|
|
{iname='internal name of first child',
|
|
|
|
|
},
|
|
|
|
|
{iname='internal name of second child',
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
]}"
|
|
|
|
|
\endcode
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
The value of the \c iname field is the internal name of the object,
|
2011-09-27 11:52:34 +02:00
|
|
|
constituting a dot-separated list of identifiers, corresponding to the
|
|
|
|
|
position of the object's representation in the view. If it is not
|
|
|
|
|
present, is it generated by concatenating the parent object's iname,
|
|
|
|
|
a dot, and a sequential number.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
The value of the \c name field is displayed in the \gui{Name} column
|
2011-09-27 11:52:34 +02:00
|
|
|
of the view. If it is not specified, a simple number in brackets
|
|
|
|
|
is used instead.
|
|
|
|
|
|
|
|
|
|
While in theory, you can build up the entire string above manually, it is
|
|
|
|
|
easier to employ the Dumper Python class for that purpose. The Dumper
|
|
|
|
|
Python class contains a complete framework to take care of the \c iname and
|
|
|
|
|
\c addr fields, to handle children of simple types, references, pointers,
|
2013-10-07 13:34:40 +02:00
|
|
|
enums, known and unknown structs as well as some convenience functions to
|
2011-09-27 11:52:34 +02:00
|
|
|
handle common situations.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
The member functions of the \c Dumper class are the following:
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{__init__(self)} - Initializes the output to an empty string and
|
2011-09-27 11:52:34 +02:00
|
|
|
empties the child stack. This should not be used in user code.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{put(self, value)} - Low level function to directly append to the
|
2011-09-27 11:52:34 +02:00
|
|
|
output string. That is also the fastest way to append output.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putField(self, name, value)} - Appends a \c{name='value'} field.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{childRange(self)} - Returns the range of children specified in
|
2011-09-27 11:52:34 +02:00
|
|
|
the current \c Children scope.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putItemCount(self, count)} - Appends a field
|
2011-09-27 11:52:34 +02:00
|
|
|
\c {value='<%d items'} to the output.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putEllipsis(self)} - Appends fields
|
2011-09-27 11:52:34 +02:00
|
|
|
\c {'{name="<incomplete>",value="",type="",numchild="0"}'}. This is
|
|
|
|
|
automatically done by \c endChildren if the number of children to
|
|
|
|
|
print is smaller than the number of actual children.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putName(self, name)} - Appends a \c {name=''} field.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putType(self, type, priority=0)} - Appends a field \c {type=''}
|
2011-09-27 11:52:34 +02:00
|
|
|
unless the \a type coincides with the parent's default child type or
|
|
|
|
|
\c putType was already called for the current item with a higher
|
|
|
|
|
value of \c priority.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putBetterType(self, type)} - Overrides the last recorded
|
2011-09-27 11:52:34 +02:00
|
|
|
\c type.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putNumChild(self, numchild)} - Appends a field \c {numchild=''}
|
2011-09-27 11:52:34 +02:00
|
|
|
unless the \c numchild coincides with the parent's default child
|
|
|
|
|
numchild value.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putValue(self, value, encoding = None)} - Append a file \c {value=''},
|
2011-09-27 11:52:34 +02:00
|
|
|
optionally followed by a field \c {valueencoding=''}. The \c value
|
|
|
|
|
needs to be convertible to a string entirely consisting of
|
|
|
|
|
alphanumerical values. The \c encoding parameter can be used to
|
|
|
|
|
specify the encoding in case the real value had to be encoded in some
|
|
|
|
|
way to meet the alphanumerical-only requirement.
|
|
|
|
|
Currently the following encodings are supported:
|
|
|
|
|
|
|
|
|
|
\list
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li 0: unencoded 8 bit data, interpreted as Latin1.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li 1: base64 encoded 8 bit data, used for QByteArray,
|
2011-09-27 11:52:34 +02:00
|
|
|
double quotes are added.
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li 2: base64 encoded 16 bit data, used for QString,
|
2011-09-27 11:52:34 +02:00
|
|
|
double quotes are added.
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li 3: base64 encoded 32 bit data,
|
2011-09-27 11:52:34 +02:00
|
|
|
double quotes are added.
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li 4: base64 encoded 16 bit data, without quotes (see 2)
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li 5: base64 encoded 8 bit data, without quotes (see 1)
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li 6: %02x encoded 8 bit data (as with \c QByteArray::toHex),
|
2011-09-27 11:52:34 +02:00
|
|
|
double quotes are added.
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li 7: %04x encoded 16 bit data (as with \c QByteArray::toHex),
|
2011-09-27 11:52:34 +02:00
|
|
|
double quotes are added.
|
|
|
|
|
\endlist
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putStringValue(self, value)} - Encodes a QString and calls
|
2011-09-27 11:52:34 +02:00
|
|
|
\c putValue with the correct \c encoding setting.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putByteArrayValue(self, value)} - Encodes a QByteArray and calls
|
2011-09-27 11:52:34 +02:00
|
|
|
\c putValue with the correct \c encoding setting.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{isExpanded()} - Checks whether the current item
|
2011-09-27 11:52:34 +02:00
|
|
|
is expanded in the view.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putIntItem(self, name, value)} - Equivalent to:
|
2011-09-27 11:52:34 +02:00
|
|
|
\code
|
|
|
|
|
with SubItem(self, name):
|
|
|
|
|
self.putValue(value)
|
|
|
|
|
self.putAddress(value.address)
|
|
|
|
|
self.putType("int")
|
|
|
|
|
self.putNumChild(0)
|
|
|
|
|
\endcode
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putBoolItem(self, name, value)} - Equivalent to:
|
2011-09-27 11:52:34 +02:00
|
|
|
\code
|
|
|
|
|
with SubItem(self, name):
|
|
|
|
|
self.putValue(value)
|
|
|
|
|
self.putType("bool")
|
|
|
|
|
self.putNumChild(0)
|
|
|
|
|
\endcode
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putCallItem(self, name, value, func, *args)} -
|
2011-09-27 11:52:34 +02:00
|
|
|
Uses GDB to call the function \c func on the value specified by
|
2012-11-17 21:35:02 +01:00
|
|
|
\a {value} and output the resulting item. Use \c{putCallItem}
|
|
|
|
|
only if there is no other way to access the data.
|
|
|
|
|
Calls cannot be executed
|
|
|
|
|
when inspecting a core file, they are expensive to execute
|
|
|
|
|
and have the potential to change the state of the debugged
|
|
|
|
|
program.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putItem(self, value)} - The "master function", handling
|
2011-09-27 11:52:34 +02:00
|
|
|
basic types, references, pointers and enums directly, iterates
|
|
|
|
|
over base classes and class members of compound types and calls
|
|
|
|
|
\c qdump__* functions whenever appropriate.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
\li \c{putSubItem(self, component, value)} - Equivalent to:
|
2011-09-27 11:52:34 +02:00
|
|
|
\code
|
|
|
|
|
with SubItem(self, component):
|
|
|
|
|
self.putItem(value)
|
|
|
|
|
\endcode
|
|
|
|
|
|
|
|
|
|
Exceptions raised by nested function calls are caught and all
|
|
|
|
|
output produced by \c putItem is replaced by the output of:
|
|
|
|
|
|
|
|
|
|
\code
|
|
|
|
|
except RuntimeError:
|
|
|
|
|
d.put('value="<invalid>",type="<unknown>",numchild="0",')
|
|
|
|
|
\endcode
|
|
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
\section2 Children and SubItem Class
|
|
|
|
|
|
|
|
|
|
The attempt to create child items might lead to errors if data is
|
|
|
|
|
uninitialized or corrupted. To gracefully recover in such situations,
|
|
|
|
|
use \c Children and \c SubItem \e{Context Managers} to create the nested
|
|
|
|
|
items.
|
|
|
|
|
|
2013-11-21 11:32:25 +01:00
|
|
|
The \c Children constructor \c{__init__(self, dumper, numChild = 1,
|
2011-09-27 11:52:34 +02:00
|
|
|
childType = None, childNumChild = None, maxNumChild = None, addrBase = None,
|
|
|
|
|
addrStep = None)} uses one mandatory argument and several
|
|
|
|
|
optional arguments. The mandatory argument refers to the current \c Dumper
|
|
|
|
|
object. The optional arguments can be used to specify the number \c numChild
|
|
|
|
|
of children, with type \c childType_ and \c childNumChild_ grandchildren
|
|
|
|
|
each. If \c maxNumChild is specified, only that many children are displayed.
|
|
|
|
|
This should be used when dumping container contents that might take
|
|
|
|
|
overly long otherwise. The parameters \c addrBase and \c addrStep
|
|
|
|
|
can be used to reduce the amount of data produced by the child dumpers.
|
|
|
|
|
Address printing for the \e{n}th child item will be suppressed if its address
|
|
|
|
|
equals with \e{addrBase + n * addrStep}.
|
|
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
\code
|
|
|
|
|
d.putNumChild(2) # Annouce children to make the item expandable in the view.
|
|
|
|
|
if d.isExpanded():
|
|
|
|
|
with Children(d):
|
|
|
|
|
with SubItem(d):
|
|
|
|
|
d.putName("key")
|
|
|
|
|
d.putItem(key)
|
|
|
|
|
with SubItem(d):
|
|
|
|
|
d.putName("value")
|
|
|
|
|
d.putItem(value)
|
|
|
|
|
\endcode
|
|
|
|
|
|
|
|
|
|
Note that this can be written more conveniently as:
|
|
|
|
|
\code
|
|
|
|
|
d.putNumChild(2)
|
|
|
|
|
if d.isExpanded():
|
|
|
|
|
with Children(d):
|
|
|
|
|
d.putSubItem("key", key)
|
|
|
|
|
d.putSubItem("value", value)
|
|
|
|
|
\endcode
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\contentspage index.html
|
2012-04-16 15:09:32 +02:00
|
|
|
\previouspage creator-qml-debugging-example.html
|
2011-09-27 11:52:34 +02:00
|
|
|
\page creator-troubleshooting-debugging.html
|
|
|
|
|
\nextpage creator-analyze-mode.html
|
|
|
|
|
|
|
|
|
|
\title Troubleshooting Debugger
|
|
|
|
|
|
|
|
|
|
This section lists some typical problems that you might encounter while
|
|
|
|
|
debugging and solutions to them.
|
|
|
|
|
|
|
|
|
|
\section1 Cannot Launch Debugger
|
|
|
|
|
|
|
|
|
|
Some anti-virus applications do not allow debuggers to retrieve data. For
|
|
|
|
|
example, on Windows, launching the debugger might fail with the following
|
|
|
|
|
message if the Avira AntiVir is installed on the development PC: \e{The
|
|
|
|
|
inferior stopped because it received a signal from the operating system.
|
|
|
|
|
Signal name:? signal meaning: Unknown signal.}
|
|
|
|
|
|
|
|
|
|
Some versions of Avira AntiVir Desktop-Products contain known issues in
|
|
|
|
|
various development environments, including \QC. To fix the problem,
|
|
|
|
|
Avira instructs you to update to version \c {avipbb.sys 10.0.22.22}. For
|
|
|
|
|
more information, see
|
|
|
|
|
\l{http://www.avira.com/en/support-for-business-knowledgebase-detail/kbid/805}
|
|
|
|
|
{Restricted Usability of IDE/Debuggers since 2010-12-08}.
|
|
|
|
|
|
|
|
|
|
\section1 Debugger Does Not Hit Breakpoints
|
|
|
|
|
|
|
|
|
|
You might have created a release build that does not contain debug
|
|
|
|
|
information. A GNU Compiler Collection (GCC) debug build has the \c {-g}
|
|
|
|
|
option on the compiler command line. Check that this option is present in
|
|
|
|
|
the \gui {Compile Output} pane. If it is not, adjust your build settings
|
|
|
|
|
in the \gui {Projects} mode.
|
|
|
|
|
|
|
|
|
|
\section1 Debugger Does Not Work
|
|
|
|
|
|
|
|
|
|
If the debugger does not work properly, try the following:
|
|
|
|
|
|
|
|
|
|
\list 1
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Make sure you use at least \QC 2.1.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li Make sure the debugger is set up properly. For more information,
|
2011-09-27 11:52:34 +02:00
|
|
|
see \l{Setting Up Debugger}.
|
|
|
|
|
|
2013-02-06 08:50:23 +01:00
|
|
|
\li In the \gui Debug mode, select \gui {Windows > Views > Debugger
|
2011-09-27 11:52:34 +02:00
|
|
|
Log} to open the \gui {Debugger Log} view. Browse the contents of
|
|
|
|
|
the pane on the right hand side to find out what went wrong.
|
|
|
|
|
Always attach the contents of the pane to debugger-related
|
|
|
|
|
questions to the \QC mailing list (qt-creator@trolltech.com)
|
|
|
|
|
or paste them to
|
|
|
|
|
\l{http://creator.pastebin.com}{creator.pastebin.com} before
|
|
|
|
|
asking questions in the IRC (on the #qt-creator channel at
|
|
|
|
|
FreeNode).
|
|
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
\section1 Pointer Variable Members Are Not Displayed Directly
|
|
|
|
|
|
|
|
|
|
When you use the \gui {Locals and Expressions} view to inspect a pointer
|
|
|
|
|
variable and expand the variable tree item, another tree item level
|
|
|
|
|
is displayed. To directly display the members of the pointer variable,
|
|
|
|
|
select \gui {Dereference Pointers Automatically} in the context menu in the
|
|
|
|
|
\gui {Locals and Expressions} view.
|
|
|
|
|
|
|
|
|
|
\section1 Structure Members Are Not Sorted According to Structure Layout
|
|
|
|
|
|
|
|
|
|
By default, structure members are displayed in alphabetic order.
|
|
|
|
|
To inspect the real layout in memory, deselect \gui {Sort Members of
|
|
|
|
|
Classes and Structs Alphabetically} in the context menu in the
|
|
|
|
|
\gui {Locals and Expressions} view.
|
|
|
|
|
|
|
|
|
|
\section1 Built-in Debugger Is Slow During Startup and Runtime
|
|
|
|
|
|
2011-12-05 13:29:18 +01:00
|
|
|
The part of the slowness that is related to the loading of
|
|
|
|
|
debug information is hard to avoid. Another part stems from
|
|
|
|
|
maintaining breakpoints inside the debugger (under some circumstances
|
|
|
|
|
all breakpoints need to be inserted and removed again for each step)
|
|
|
|
|
and the evaluation of expressions after each step. We recommend that
|
|
|
|
|
you minimize the number of breakpoints and watched expressions.
|
2011-09-27 11:52:34 +02:00
|
|
|
|
|
|
|
|
\section1 Debugger Displays <not in scope> Message
|
|
|
|
|
|
|
|
|
|
The message is created by the debugging helpers. \QC posts an
|
|
|
|
|
expression to the GDB command line to invoke the debugging helpers.
|
|
|
|
|
The expression includes the address of the object to examine. This
|
|
|
|
|
address might be modified by GDB before the helper function is called. It
|
|
|
|
|
is unclear why and when this happens, but if it happens, the debugging
|
|
|
|
|
helpers operate on wrong data and come to wrong conclusions. Most likely,
|
|
|
|
|
they find garbage and declare the variable to be <not in scope>.
|
|
|
|
|
|
|
|
|
|
\section1 Application Crashes when Debugging on Mac OS X Snow Leopard
|
|
|
|
|
|
|
|
|
|
You must use a workaround to use the DYLD_IMAGE_SUFFIX option in the
|
|
|
|
|
\gui Projects tab on Mac OS X Snow Leopard. For more information on the
|
|
|
|
|
issue, see
|
|
|
|
|
\l{http://wimleers.com/blog/dyld-image-suffix-causing-havoc-on-mac-os-x-snow-leopard}
|
|
|
|
|
{DYLD_IMAGE_SUFFIX causing havoc on Mac OS X Snow Leopard}.
|
|
|
|
|
|
|
|
|
|
To use the option, enter the following commands in the Terminal
|
|
|
|
|
application:
|
|
|
|
|
\code
|
|
|
|
|
sudo mv /usr/lib/libSystem.B_debug.dylib /usr/lib/libSystem.B_debug.dylib.backup
|
|
|
|
|
sudo cp /usr/lib/libSystem.B.dylib /usr/lib/libSystem.B_debug.dylib.backup
|
|
|
|
|
\endcode
|
|
|
|
|
|
|
|
|
|
\section1 Debugger Cannot Attach to Running Process on Linux
|
|
|
|
|
|
|
|
|
|
GDB uses \c ptrace to attach to running processes. Some Linux distributions
|
|
|
|
|
do not allow this, which stops all attempts to either directly attach to an
|
|
|
|
|
existing process or use the \gui {Run in terminal} option in \QC.
|
|
|
|
|
|
|
|
|
|
The reasons for this are described in
|
2013-05-31 14:26:01 +02:00
|
|
|
\l{http://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening#ptrace%20Protection}
|
2011-09-27 11:52:34 +02:00
|
|
|
{KernelHardening}.
|
|
|
|
|
|
|
|
|
|
However, the usefulness of this security measure seems dubious,
|
|
|
|
|
because this feature can be easily disabled. With root permissions, you can
|
2013-02-27 16:11:15 +01:00
|
|
|
disable the feature temporarily by writing \c{0} into
|
|
|
|
|
\c{/proc/sys/kernel/yama/ptrace_scope} or permanently by changing
|
|
|
|
|
the value in \c{/etc/sysctl.d/10-ptrace.conf}.
|
|
|
|
|
Even if you do not have elevated
|
2011-09-27 11:52:34 +02:00
|
|
|
permissions, you can disable the feature later by adding a library that
|
|
|
|
|
calls \c{prctl(0x59616d61, getppid(), 0, 0, 0);}, such as the one in
|
|
|
|
|
\c{$QTCREATORDIR/lib/libptracepreload.so} to the LD_PRELOAD environment.
|
|
|
|
|
|
|
|
|
|
*/
|