...
 
Commits (34)
The QtCreator 1.2.1 release is a bug fix release and updates translations.
Below is a list of relevant changes. You can find a complete list of changes
within the logs of Qt Creator's sources. Simply check it out from the public git
repository e.g.,
git clone git://gitorious.org/qt-creator/qt-creator.git
git log --pretty=oneline v1.2.0..v1.2.1
Building and Running
* Fixed crash when clicking on the Build Settings tab with an invalid Qt version.
* Fixed crash when removing an active .pro file outside Qt Creator.
Editor
* Fixed crash when completing function-like arguments
Debugging
* Fixed problem with GDB debugging after first debugging run
* Fixed display of debugging helper status in some cases
* Disallow starting CDB debugger more than once
* Additional debug output for the CDB debugger
* Make loading debugging helpers more reliable with GDB
* Fixed regression in QVariant dumper
* Removed QtGui dependency from debugging helpers
* Made it possible to build the debugging helpers for Qt 4.4 again
I18N:
* Fixed Russian translation
BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV {
font-family: Arial, Geneva, Helvetica, sans-serif;
}
H1 {
text-align: center;
font-size: 160%;
}
H2 {
font-size: 120%;
}
H3 {
font-size: 100%;
}
h3.fn,span.fn
{
margin-left: 1cm;
text-indent: -1cm;
background-color: #eee;
border-width: 1px;
border-style: solid;
border-color: #ddd;
font-weight: bold;
padding: 6px 0px 6px 10px;
margin: 42px 0px 0px 0px;
}
hr {
border: 0;
color: #a0a0a0;
background-color: #ccc;
height: 1px;
width: 100%;
text-align: left;
margin: 34px 0px 34px 0px;
}
table.valuelist {
border-width: 1px 1px 1px 1px;
border-style: solid;
border-color: #dddddd;
border-collapse: collapse;
background-color: #f0f0f0;
}
table.indextable {
border-width: 1px 1px 1px 1px;
border-collapse: collapse;
background-color: #f0f0f0;
border-color:#555;
font-size: 110%;
}
table td.largeindex {
border-width: 1px 1px 1px 1px;
border-collapse: collapse;
background-color: #f0f0f0;
border-color:#555;
font-size: 120%;
}
table.valuelist th {
border-width: 1px 1px 1px 2px;
padding: 4px;
border-style: solid;
border-color: #666;
color:white;
background-color:#666;
}
th.titleheader {
border-width: 1px 0px 1px 0px;
padding: 4px;
border-style: solid;
border-color: #444;
color:white;
background-color:#555555;
font-size: 110%;
}
th.largeheader {
border-width: 1px 0px 1px 0px;
padding: 4px;
border-style: solid;
border-color: #444;
color:white;
background-color:#555555;
font-size: 120%;
}
p {
margin-left: 4px;
margin-top: 8px;
margin-bottom: 8px;
}
a:link
{
color: #004faf;
color: #0046ad;
text-decoration: none
}
......@@ -16,14 +105,28 @@ a:visited
text-decoration: none
}
td.postheader
a.obsolete
{
color: #661100;
text-decoration: none
}
a.compat
{
color: #661100;
text-decoration: none
}
a.obsolete:visited
{
font-family: sans-serif
color: #995500;
text-decoration: none
}
tr.address
a.compat:visited
{
font-family: sans-serif
color: #995500;
text-decoration: none
}
body
......@@ -32,6 +135,34 @@ body
color: black
}
table.generic, table.annotated
{
border-width: 1px;
border-color:#bbb;
border-style:solid;
border-collapse:collapse;
}
table td.memItemLeft {
width: 180px;
padding: 2px 0px 0px 8px;
margin: 4px;
border-width: 1px;
border-color: #E0E0E0;
border-style: none;
font-size: 100%;
white-space: nowrap
}
table td.memItemRight {
padding: 2px 8px 0px 8px;
margin: 4px;
border-width: 1px;
border-color: #E0E0E0;
border-style: none;
font-size: 100%;
}
table tr.odd {
background: #f0f0f0;
color: black;
......@@ -53,17 +184,17 @@ table.annotated td {
table tr pre
{
padding-top: none;
padding-bottom: none;
padding-left: none;
padding-right: none;
padding-top: 0px;
padding-bottom: 0px;
padding-left: 0px;
padding-right: 0px;
border: none;
background: none
}
tr.qt-style
{
background: #a2c511;
background: #96E066;
color: black
}
......@@ -75,6 +206,14 @@ body pre
color: black
}
table tr.qt-code pre
{
padding: 0.2em;
border: #e7e7e7 1px solid;
background: #f1f1f1;
color: black
}
span.preprocessor, span.preprocessor a
{
color: darkblue;
......@@ -91,6 +230,11 @@ span.string,span.char
color: darkgreen;
}
.title
{
text-align: center
}
.subtitle
{
font-size: 0.8em
......@@ -100,3 +244,52 @@ span.string,span.char
{
font-size: 0.65em
}
.qmlitem {
padding: 0;
}
.qmlname {
white-space: nowrap;
font-weight: bold;
font-size: 125%;
}
.qmltype {
font-weight: bold;
font-size: 125%;
}
.qmlproto, .qmldoc {
// border-top: 1px solid #84b0c7;
}
.qmlproto {
padding: 0;
//background-color: #e4e4e4;//#d5e1e8;
//font-weight: bold;
//-webkit-border-top-left-radius: 8px;
//-webkit-border-top-right-radius: 8px;
//-moz-border-radius-topleft: 8px;
//-moz-border-radius-topright: 8px;
}
.qmldoc {
border-top: 1px solid #e4e4e4;
//padding: 2px 5px;
//background-color: #eef3f5;
//border-top-width: 0;
//-webkit-border-bottom-left-radius: 8px;
//-webkit-border-bottom-right-radius: 8px;
//-moz-border-radius-bottomleft: 8px;
//-moz-border-radius-bottomright: 8px;
}
.qmldoc p, .qmldoc dl, .qmldoc ul {
//margin: 6px 0;
}
*.qmlitem p {
//margin-top: 0px;
//margin-bottom: 0px;
}
doc/images/qtcreator-screenshots.png

243 KB | W: | H:

doc/images/qtcreator-screenshots.png

81.2 KB | W: | H:

doc/images/qtcreator-screenshots.png
doc/images/qtcreator-screenshots.png
doc/images/qtcreator-screenshots.png
doc/images/qtcreator-screenshots.png
  • 2-up
  • Swipe
  • Onion skin
This diff is collapsed.
This diff is collapsed.
......@@ -9,24 +9,26 @@ sourcedirs = $SRCDIR
imagedirs = $SRCDIR/images
outputdir = $OUTDIR
exampledirs = $SRCDIR
indexes = qt.index
extraimages.HTML = qt-logo \
trolltech-logo
qtcreator-screenshots
sources.fileextensions = "qtcreator.qdoc addressbook-sdk.qdoc"
qhp.projects = QtCreator
qhp.QtCreator.file = qtcreator.qhp
qhp.QtCreator.namespace = com.nokia.qtcreator.120
qhp.QtCreator.namespace = com.nokia.qtcreator.121
qhp.QtCreator.virtualFolder = doc
qhp.QtCreator.indexTitle = Qt Creator
qhp.QtCreator.indexRoot =
qhp.QtCreator.extraFiles = classic.css \
images/qt-logo.png
qhp.QtCreator.filterAttributes = qtcreator 1.2.0
qhp.QtCreator.customFilters.QtCreator.name = Qt Creator 1.2.0
qhp.QtCreator.customFilters.QtCreator.filterAttributes = qtcreator 1.2.0
images/qt-logo.png \
images/qtcreator-screenshots.png
qhp.QtCreator.filterAttributes = qtcreator 1.2.1
qhp.QtCreator.customFilters.QtCreator.name = Qt Creator 1.2.1
qhp.QtCreator.customFilters.QtCreator.filterAttributes = qtcreator 1.2.1
# macros.qdocconf
......@@ -85,7 +87,6 @@ macro.i81 = "\\o{8,1}"
macro.i91 = "\\o{9,1}"
macro.img = "\\image"
macro.endquote = "\\endquotation"
spurious = "Missing comma in .*" \
"Missing pattern .*"
......@@ -189,18 +190,26 @@ HTML.stylesheets = classic.css
HTML.postheader = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n" \
"<tr>\n" \
"<td align=\"left\" valign=\"top\" width=\"32\">" \
"<img src=\"images/qt-logo.png\" align=\"left\" width=\"32\" height=\"32\" border=\"0\" />" \
"<a href=\"http://qt.nokia.com/\"><img src=\"images/qt-logo.png\" align=\"left\" border=\"0\" /></a>" \
"</td>\n" \
"<td width=\"1\">&nbsp;&nbsp;</td>" \
"<td class=\"postheader\" valign=\"center\">" \
"<a href=\"qtcreator-manual.html\">" \
"<font color=\"#004faf\">Home</font></a>" \
"</td>\n" \
"<td align=\"right\" valign=\"top\" width=\"230\"></td></tr></table><br>"
"<a href=\"index.html\">" \
"<font color=\"#004faf\">Home</font></a>&nbsp;&middot; " \
"<a href=\"creator-code-editor.html\">" \
"<font color=\"#004faf\">Editor</font></a>&nbsp;&middot; " \
"<a href=\"creator-navigation.html\">" \
"<font color=\"#004faf\">Code Navigation</font></a>&nbsp;&middot; " \
"<a href=\"creator-keyboard-shortcuts.html\">" \
"<font color=\"#004faf\">Shortcuts</font></a>&nbsp;&middot; " \
"<a href=\"http://qt.gitorious.org/qt-creator/pages/Home\">" \
"<font color=\"#004faf\">Wiki</font></a>" \
"</td>" \
"</tr></table>"
HTML.footer = "<p /><address><hr /><div align=\"center\">\n" \
"<table width=\"100%\" cellspacing=\"0\" border=\"0\"><tr class=\"address\">\n" \
"<td width=\"30%\" align=\"left\">Copyright &copy; 2009 Nokia</td>\n" \
"<td width=\"40%\" align=\"center\">&nbsp;</td>\n" \
"<td width=\"30%\" align=\"right\"><div align=\"right\">Qt Creator 1.2.0</div></td>\n" \
"<table width=\"100%\" cellspacing=\"0\" border=\"0\"><tr class=\"address\">\n" \
"<td width=\"40%\" align=\"left\">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies)</td>\n" \
"<td width=\"20%\" align=\"center\"><a href=\"trademarks.html\">Trademarks</a></td>\n" \
"<td width=\"40%\" align=\"right\"><div align=\"right\">Qt Creator 1.2.1</div></td>\n" \
"</tr></table></div></address>"
......@@ -44,15 +44,24 @@
#include <QtCore/QObject>
#include <QtCore/QPointer>
#include <QtCore/QString>
#include <QtCore/QSharedPointer>
#include <QtCore/QSharedDataPointer>
#include <QtCore/QTextCodec>
#include <QtCore/QVector>
#if QT_VERSION >= 0x040500
#include <QtCore/QSharedPointer>
#include <QtCore/QSharedDataPointer>
#include <QtCore/QWeakPointer>
#endif
int qtGhVersion = QT_VERSION;
#ifdef QT_GUI_LIB
#ifndef USE_QT_GUI
# ifdef QT_GUI_LIB
# define USE_QT_GUI 1
# endif
#endif
#if USE_QT_GUI
# include <QtGui/QWidget>
# include <QtGui/QPixmap>
# include <QtGui/QImage>
......@@ -1296,9 +1305,9 @@ static void qDumpQHashNode(QDumper &d)
d.disarm();
}
#if USE_QT_GUI
static void qDumpQImage(QDumper &d)
{
#ifdef QT_GUI_LIB
const QImage &im = *reinterpret_cast<const QImage *>(d.data);
P(d, "value", "(" << im.width() << "x" << im.height() << ")");
P(d, "type", NS"QImage");
......@@ -1312,14 +1321,12 @@ static void qDumpQImage(QDumper &d)
d.endHash();
}
d.disarm();
#else
Q_UNUSED(d);
#endif
}
#endif
#if USE_QT_GUI
static void qDumpQImageData(QDumper &d)
{
#ifdef QT_GUI_LIB
const QImage &im = *reinterpret_cast<const QImage *>(d.data);
const QByteArray ba(QByteArray::fromRawData((const char*)im.bits(), im.numBytes()));
P(d, "type", NS"QImageData");
......@@ -1334,10 +1341,8 @@ static void qDumpQImageData(QDumper &d)
P(d, "value", ba);
#endif
d.disarm();
#else
Q_UNUSED(d);
#endif
}
#endif
static void qDumpQList(QDumper &d)
{
......@@ -2020,18 +2025,16 @@ static void qDumpQObjectSlotList(QDumper &d)
}
#if USE_QT_GUI
static void qDumpQPixmap(QDumper &d)
{
#ifdef QT_GUI_LIB
const QPixmap &im = *reinterpret_cast<const QPixmap *>(d.data);
P(d, "value", "(" << im.width() << "x" << im.height() << ")");
P(d, "type", NS"QPixmap");
P(d, "numchild", "0");
d.disarm();
#else
Q_UNUSED(d);
#endif
}
#endif
static void qDumpQSet(QDumper &d)
{
......@@ -2078,6 +2081,7 @@ static void qDumpQSet(QDumper &d)
d.disarm();
}
#if QT_VERSION >= 0x040500
static void qDumpQSharedPointer(QDumper &d)
{
const QSharedPointer<int> &ptr =
......@@ -2116,6 +2120,7 @@ static void qDumpQSharedPointer(QDumper &d)
}
d.disarm();
}
#endif
static void qDumpQString(QDumper &d)
{
......@@ -2243,7 +2248,7 @@ static void qDumpQVariant(QDumper &d)
if (isInvalid) {
P(d, "value", "(invalid)");
} else if (value.isEmpty()) {
P(d, "value", "(" << v.typeName() << ") " << qPrintable(value));
P(d, "value", "(" << v.typeName() << ") ");
} else {
QByteArray ba;
ba += '(';
......@@ -2251,7 +2256,7 @@ static void qDumpQVariant(QDumper &d)
ba += ") ";
ba += qPrintable(value);
P(d, "value", ba);
P(d, "valueencoded", "4");
P(d, "valueencoded", "5");
}
P(d, "type", NS"QVariant");
P(d, "numchild", (isInvalid ? "0" : "1"));
......@@ -2315,6 +2320,7 @@ static void qDumpQVector(QDumper &d)
d.disarm();
}
#if QT_VERSION >= 0x040500
static void qDumpQWeakPointer(QDumper &d)
{
const int v = sizeof(void *);
......@@ -2352,6 +2358,7 @@ static void qDumpQWeakPointer(QDumper &d)
}
d.disarm();
}
#endif
static void qDumpStdList(QDumper &d)
{
......@@ -2691,10 +2698,12 @@ static void handleProtocolVersion2and3(QDumper & d)
qDumpStdList(d);
break;
case 'I':
#if USE_QT_GUI
if (isEqual(type, "QImage"))
qDumpQImage(d);
else if (isEqual(type, "QImageData"))
qDumpQImageData(d);
#endif
break;
case 'L':
if (isEqual(type, "QList"))
......@@ -2731,14 +2740,18 @@ static void handleProtocolVersion2and3(QDumper & d)
qDumpQObjectSlotList(d);
break;
case 'P':
#if USE_QT_GUI
if (isEqual(type, "QPixmap"))
qDumpQPixmap(d);
#endif
break;
case 'S':
if (isEqual(type, "QSet"))
qDumpQSet(d);
#if QT_VERSION >= 0x040500
else if (isEqual(type, "QSharedPointer"))
qDumpQSharedPointer(d);
#endif
else if (isEqual(type, "QString"))
qDumpQString(d);
else if (isEqual(type, "QStringList"))
......@@ -2775,8 +2788,11 @@ static void handleProtocolVersion2and3(QDumper & d)
qDumpQVector(d);
break;
case 'W':
#if QT_VERSION >= 0x040500
if (isEqual(type, "QWeakPointer"))
qDumpQWeakPointer(d);
#endif
break;
}
if (!d.success)
......@@ -2835,9 +2851,6 @@ void *qDumpObjectData440(
"\""NS"QMap\","
"\""NS"QMapNode\","
"\""NS"QModelIndex\","
#if QT_VERSION >= 0x040500
"\""NS"QMultiMap\","
#endif
"\""NS"QObject\","
"\""NS"QObjectMethodList\"," // hack to get nested properties display
"\""NS"QObjectPropertyList\","
......@@ -2847,14 +2860,19 @@ void *qDumpObjectData440(
"\""NS"QObjectSlotList\","
// << "\""NS"QRegion\","
"\""NS"QSet\","
"\""NS"QSharedPointer\","
"\""NS"QString\","
"\""NS"QStringList\","
"\""NS"QTextCodec\","
"\""NS"QVariant\","
"\""NS"QVector\","
"\""NS"QWeakPointer\","
#if USE_QT_GUI
"\""NS"QWidget\","
#endif
#if QT_VERSION >= 0x040500
"\""NS"QMultiMap\","
"\""NS"QSharedPointer\","
"\""NS"QWeakPointer\","
#endif
#ifdef Q_OS_WIN
"\"basic_string\","
"\"list\","
......@@ -2884,7 +2902,7 @@ void *qDumpObjectData440(
<< ""NS"QString=\"" << sizeof(QString) << "\","
<< ""NS"QStringList=\"" << sizeof(QStringList) << "\","
<< ""NS"QObject=\"" << sizeof(QObject) << "\","
#ifdef QT_GUI_LIB
#if USE_QT_GUI
<< ""NS"QWidget=\"" << sizeof(QWidget)<< "\","
#endif
#ifdef Q_OS_WIN
......
TEMPLATE = lib
CONFIG += shared
QT = core
linux-* {
CONFIG -= release
CONFIG += debug
}
SOURCES=gdbmacros.cpp
true {
DEFINES += USE_QT_GUI=0
QT = core
} else {
DEFINES += USE_QT_GUI=1
QT = core gui
}
exists($$QMAKE_INCDIR_QT/QtCore/private/qobject_p.h) {
DEFINES+=HAS_QOBJECT_P_H
}
......@@ -1759,7 +1759,7 @@ Sollen sie überschrieben werden?</translation>
<location line="+11"/>
<source>From revision %1&lt;br/&gt;</source>
<extracomment>This gets conditionally inserted as argument %8 into the description string.</extracomment>
<translation>Revision:</translation>
<translation>Revision %1&lt;br/&gt;</translation>
</message>
<message>
<location line="+3"/>
......
......@@ -1721,7 +1721,7 @@ Would you like to overwrite them?</source>
<location line="+11"/>
<source>From revision %1&lt;br/&gt;</source>
<extracomment>This gets conditionally inserted as argument %8 into the description string.</extracomment>
<translation>Revisión %1</translation>
<translation>Revisión %1&lt;br/&gt;</translation>
</message>
<message>
<location line="+3"/>
......
......@@ -182,8 +182,8 @@
<key>CFBundleIdentifier</key>
<string>com.nokia.qtcreator</string>
<key>CFBundleVersion</key>
<string>1.2.0</string>
<string>1.2.1</string>
<key>CFBundleShortVersionString</key>
<string>1.2.0</string>
<string>1.2.1</string>
</dict>
</plist>
......@@ -667,7 +667,7 @@ ResolveExpression::resolveMemberExpression(const QList<Result> &baseResults,
if (NamedType *namedTy = ty->asNamedType())
results += resolveMember(p, memberName, namedTy);
else if (Function *fun = ty->asFunctionType()) {
if (fun->scope()->isBlockScope() || fun->scope()->isNamespaceScope()) {
if (fun->scope() && (fun->scope()->isBlockScope() || fun->scope()->isNamespaceScope())) {
ty = fun->returnType();
if (ReferenceType *refTy = ty->asReferenceType())
......@@ -881,7 +881,7 @@ QList<Symbol *> ResolveClass::resolveClass(NamedType *namedTy,
if (Function *funTy = decl->type()->asFunctionType()) {
// QString foo("ciao");
// foo.
if (funTy->scope()->isBlockScope() || funTy->scope()->isNamespaceScope()) {
if (funTy->scope() && (funTy->scope()->isBlockScope() || funTy->scope()->isNamespaceScope())) {
const ResolveExpression::Result r(funTy->returnType(), decl);
resolvedSymbols += resolveClass(r, context);
}
......
......@@ -243,8 +243,13 @@ void SavedAction::readSettings(QSettings *settings)
if (m_settingsGroup.isEmpty() || m_settingsKey.isEmpty())
return;
settings->beginGroup(m_settingsGroup);
setValue(settings->value(m_settingsKey, m_defaultValue), false);
//qDebug() << "READING: " << m_settingsKey << " -> " << m_value;
QVariant var = settings->value(m_settingsKey, m_defaultValue);
// work around old ini files containing @Invalid() entries
if (isCheckable() && !var.isValid())
var = false;
setValue(var);
//qDebug() << "READING: " << var.isValid() << m_settingsKey << " -> " << m_value
// << " (default: " << m_defaultValue << ")" << var;
settings->endGroup();
}
......
<plugin name="BinEditor" version="1.2.0" compatVersion="1.2.0">
<plugin name="BinEditor" version="1.2.1" compatVersion="1.2.1">
<vendor>Nokia Corporation</vendor>
<copyright>(C) 2008-2009 Nokia Corporation</copyright>
<license>
......@@ -19,7 +19,7 @@ will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.</license>
<description>Binary editor component.</description>
<url>http://www.qtsoftware.com</url>
<dependencyList>
<dependency name="Core" version="1.2.0"/>
<dependency name="TextEditor" version="1.2.0"/>
<dependency name="Core" version="1.2.1"/>
<dependency name="TextEditor" version="1.2.1"/>
</dependencyList>
</plugin>
<plugin name="Bookmarks" version="1.2.0" compatVersion="1.2.0">
<plugin name="Bookmarks" version="1.2.1" compatVersion="1.2.1">
<vendor>Nokia Corporation</vendor>
<copyright>(C) 2008-2009 Nokia Corporation</copyright>
<license>
......@@ -19,8 +19,8 @@ will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.</license>
<description>Bookmarks in text editors.</description>
<url>http://www.qtsoftware.com</url>
<dependencyList>
<dependency name="TextEditor" version="1.2.0"/>
<dependency name="ProjectExplorer" version="1.2.0"/>
<dependency name="Core" version="1.2.0"/>
<dependency name="TextEditor" version="1.2.1"/>
<dependency name="ProjectExplorer" version="1.2.1"/>
<dependency name="Core" version="1.2.1"/>
</dependencyList>
</plugin>
<plugin name="CMakeProjectManager" version="1.2.0" compatVersion="1.2.0">
<plugin name="CMakeProjectManager" version="1.2.1" compatVersion="1.2.1">
<vendor>Nokia Corporation</vendor>
<copyright>(C) 2008-2009 Nokia Corporation</copyright>
<license>
......@@ -19,9 +19,9 @@ will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.</license>
<description>CMake support</description>
<url>http://www.qtsoftware.com</url>
<dependencyList>
<dependency name="TextEditor" version="1.2.0"/>
<dependency name="ProjectExplorer" version="1.2.0"/>
<dependency name="CppTools" version="1.2.0"/>
<dependency name="CppEditor" version="1.2.0"/>
<dependency name="TextEditor" version="1.2.1"/>
<dependency name="ProjectExplorer" version="1.2.1"/>
<dependency name="CppTools" version="1.2.1"/>
<dependency name="CppEditor" version="1.2.1"/>
</dependencyList>
</plugin>
<plugin name="Core" version="1.2.0" compatVersion="1.2.0">
<plugin name="Core" version="1.2.1" compatVersion="1.2.1">
<vendor>Nokia Corporation</vendor>
<copyright>(C) 2008-2009 Nokia Corporation</copyright>
<license>
......
......@@ -35,7 +35,7 @@ namespace Constants {
#define IDE_VERSION_MAJOR 1
#define IDE_VERSION_MINOR 2
#define IDE_VERSION_RELEASE 0
#define IDE_VERSION_RELEASE 1
#define STRINGIFY_INTERNAL(x) #x
#define STRINGIFY(x) STRINGIFY_INTERNAL(x)
......
<plugin name="CodePaster" version="1.2.0" compatVersion="1.2.0">
<plugin name="CodePaster" version="1.2.1" compatVersion="1.2.1">
<vendor>Nokia Corporation</vendor>
<copyright>(C) 2008-2009 Nokia Corporation</copyright>
<license>
......@@ -19,8 +19,8 @@ will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.</license>
<description>Codepaster plugin for pushing/fetching diff from server</description>
<url>http://www.qtsoftware.com</url>
<dependencyList>
<dependency name="TextEditor" version="1.2.0"/>
<dependency name="ProjectExplorer" version="1.2.0"/>
<dependency name="Core" version="1.2.0"/>
<dependency name="TextEditor" version="1.2.1"/>
<dependency name="ProjectExplorer" version="1.2.1"/>
<dependency name="Core" version="1.2.1"/>
</dependencyList>
</plugin>
<plugin name="CppEditor" version="1.2.0" compatVersion="1.2.0">
<plugin name="CppEditor" version="1.2.1" compatVersion="1.2.1">
<vendor>Nokia Corporation</vendor>
<copyright>(C) 2008-2009 Nokia Corporation</copyright>
<license>
......@@ -19,8 +19,8 @@ will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.</license>
<description>C/C++ editor component.</description>
<url>http://www.qtsoftware.com</url>
<dependencyList>
<dependency name="Core" version="1.2.0"/>
<dependency name="TextEditor" version="1.2.0"/>
<dependency name="CppTools" version="1.2.0"/>
<dependency name="Core" version="1.2.1"/>
<dependency name="TextEditor" version="1.2.1"/>
<dependency name="CppTools" version="1.2.1"/>
</dependencyList>
</plugin>
<plugin name="CppTools" version="1.2.0" compatVersion="1.2.0">
<plugin name="CppTools" version="1.2.1" compatVersion="1.2.1">
<vendor>Nokia Corporation</vendor>
<copyright>(C) 2008-2009 Nokia Corporation</copyright>
<license>
......@@ -19,8 +19,8 @@ will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.</license>
<description>Tools for analyzing C/C++ code.</description>
<url>http://www.qtsoftware.com</url>
<dependencyList>
<dependency name="TextEditor" version="1.2.0"/>
<dependency name="ProjectExplorer" version="1.2.0"/>
<dependency name="QuickOpen" version="1.2.0"/>
<dependency name="TextEditor" version="1.2.1"/>
<dependency name="ProjectExplorer" version="1.2.1"/>
<dependency name="QuickOpen" version="1.2.1"/>
</dependencyList>
</plugin>
......@@ -932,7 +932,7 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
namedTy = ty->asNamedType();
if (! namedTy) {
Function *fun = ty->asFunctionType();
if (fun && (fun->scope()->isBlockScope() || fun->scope()->isNamespaceScope()))
if (fun && fun->scope() && (fun->scope()->isBlockScope() || fun->scope()->isNamespaceScope()))
namedTy = fun->returnType()->asNamedType();
}
}
......
<plugin name="Debugger" version="1.2.0" compatVersion="1.2.0">
<plugin name="Debugger" version="1.2.1" compatVersion="1.2.1">
<vendor>Nokia Corporation</vendor>
<copyright>(C) 2008-2009 Nokia Corporation</copyright>
<license>
......@@ -19,10 +19,10 @@ will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.</license>
<description>Debugger integration.</description>
<url>http://www.qtsoftware.com</url>
<dependencyList>
<dependency name="CppEditor" version="1.2.0"/><!-- Debugger plugin adds items to the editor's context menu -->
<dependency name="ProjectExplorer" version="1.2.0"/>
<dependency name="Core" version="1.2.0"/>
<dependency name="Find" version="1.2.0"/>
<dependency name="CppEditor" version="1.2.1"/><!-- Debugger plugin adds items to the editor's context menu -->
<dependency name="ProjectExplorer" version="1.2.1"/>
<dependency name="Core" version="1.2.1"/>
<dependency name="Find" version="1.2.1"/>
</dependencyList>
<argumentList>
<argument name="-disable-cdb">Disable Cdb debugger engine</argument>
......
......@@ -281,8 +281,12 @@ void BreakHandler::removeAt(int index)
void BreakHandler::clear()
{
for (int index = size(); --index >= 0; )
removeAt(index);
qDeleteAll(m_bp);
m_bp.clear();
m_enabled.clear();
m_disabled.clear();
m_removed.clear();
m_inserted.clear();
}
int BreakHandler::findBreakpoint(const BreakpointData &needle)
......@@ -328,19 +332,19 @@ void BreakHandler::saveBreakpoints()
const BreakpointData *data = at(index);
QMap<QString, QVariant> map;
if (!data->fileName.isEmpty())
map["filename"] = data->fileName;
map.insert(QLatin1String("filename"), data->fileName);
if (!data->lineNumber.isEmpty())
map["linenumber"] = data->lineNumber;
map.insert(QLatin1String("linenumber"), data->lineNumber);
if (!data->funcName.isEmpty())
map["funcname"] = data->funcName;
map.insert(QLatin1String("funcname"), data->funcName);
if (!data->condition.isEmpty())
map["condition"] = data->condition;
map.insert(QLatin1String("condition"), data->condition);
if (!data->ignoreCount.isEmpty())
map["ignorecount"] = data->ignoreCount;
map.insert(QLatin1String("ignorecount"), data->ignoreCount);
if (!data->enabled)
map["disabled"] = "1";
map.insert(QLatin1String("disabled"), QLatin1String("1"));
if (data->useFullPath)
map["usefullpath"] = "1";
map.insert(QLatin1String("usefullpath"), QLatin1String("1"));
list.append(map);
}
setSessionValueRequested("Breakpoints", list);
......@@ -351,18 +355,31 @@ void BreakHandler::loadBreakpoints()
QVariant value;
sessionValueRequested("Breakpoints", &value);
QList<QVariant> list = value.toList();
clear();
foreach (const QVariant &var, list) {
const QMap<QString, QVariant> map = var.toMap();
BreakpointData *data = new BreakpointData(this);
data->fileName = map["filename"].toString();
data->lineNumber = map["linenumber"].toString();
data->condition = map["condition"].toString();
data->ignoreCount = map["ignorecount"].toString();
data->funcName = map["funcname"].toString();
data->enabled = !map["disabled"].toInt();
data->useFullPath = bool(map["usefullpath"].toInt());
QVariant v = map.value(QLatin1String("filename"));
if (v.isValid())
data->fileName = v.toString();
v = map.value(QLatin1String("linenumber"));
if (v.isValid())
data->lineNumber = v.toString();
v = map.value(QLatin1String("condition"));
if (v.isValid())
data->condition = v.toString();
v = map.value(QLatin1String("ignorecount"));
if (v.isValid())
data->ignoreCount = v.toInt();
v = map.value(QLatin1String("funcname"));
if (v.isValid())
data->funcName = v.toString();
v = map.value(QLatin1String("disabled"));
if (v.isValid())
data->enabled = !v.toInt();
v = map.value(QLatin1String("usefullpath"));
if (v.isValid())
data->useFullPath = bool(v.toInt());
data->markerFileName = data->fileName;
data->markerLineNumber = data->lineNumber.toInt();
append(data);
......
......@@ -407,12 +407,19 @@ static bool setBreakPointEnabledById(CIDebugControl *ctl, unsigned long id, bool
return true;
}
static inline QString msgCannotSetBreakAtFunction(const QString &func, const QString &why)
{
return QString::fromLatin1("Cannot set a breakpoint at '%1': %2").arg(func, why);
}
// Synchronize (halted) engine breakpoints with those of the BreakHandler.
bool CDBBreakPoint::synchronizeBreakPoints(CIDebugControl* debugControl,
CIDebugSymbols *syms,
BreakHandler *handler,
QString *errorMessage)
QString *errorMessage, QStringList *warnings)
{
errorMessage->clear();
warnings->clear();
// Do an initial check whether we are in a state that allows
// for modifying breakPoints
ULONG engineCount;
......@@ -420,25 +427,29 @@ bool CDBBreakPoint::synchronizeBreakPoints(CIDebugControl* debugControl,
*errorMessage = QString::fromLatin1("Cannot modify breakpoints: %1").arg(*errorMessage);
return false;
}
QString warning;
// Insert new ones
bool updateMarkers = false;
foreach (BreakpointData *nbd, handler->insertedBreakpoints()) {
warning.clear();
// Function breakpoints: Are the module names specified?
bool breakPointOk = false;
if (nbd->funcName.isEmpty()) {
breakPointOk = true;
} else {
switch (resolveSymbol(syms, &nbd->funcName, errorMessage)) {
switch (resolveSymbol(syms, &nbd->funcName, &warning)) {
case ResolveSymbolOk:
breakPointOk = true;
break;
case ResolveSymbolAmbiguous:
qWarning("Warning: %s\n", qPrintable(*errorMessage));
warnings->push_back(msgCannotSetBreakAtFunction(nbd->funcName, warning));
warning.clear();
breakPointOk = true;
break;
case ResolveSymbolNotFound:
case ResolveSymbolError:
qWarning("Warning: %s\n", qPrintable(*errorMessage));
warnings->push_back(msgCannotSetBreakAtFunction(nbd->funcName, warning));
warning.clear();
break;
};
} // function breakpoint
......@@ -447,7 +458,7 @@ bool CDBBreakPoint::synchronizeBreakPoints(CIDebugControl* debugControl,
quint64 address;
unsigned long id;
CDBBreakPoint ncdbbp(*nbd);
breakPointOk = ncdbbp.add(debugControl, &address, &id, errorMessage);
breakPointOk = ncdbbp.add(debugControl, &address, &id, &warning);
if (breakPointOk) {
if (debugBP)
qDebug() << "Added " << id << " at " << address << ncdbbp;
......@@ -464,22 +475,21 @@ bool CDBBreakPoint::synchronizeBreakPoints(CIDebugControl* debugControl,
nbd->bpFuncName = nbd->funcName;
}
} // had symbol
if (!breakPointOk)
qWarning("%s\n", qPrintable(*errorMessage));
}
if (!breakPointOk && !warning.isEmpty())
warnings->push_back(warning); }
// Delete
foreach (BreakpointData *rbd, handler->takeRemovedBreakpoints()) {
if (!removeBreakPointById(debugControl, rbd->bpNumber.toUInt(), errorMessage))
qWarning("%s\n", qPrintable(*errorMessage));
if (!removeBreakPointById(debugControl, rbd->bpNumber.toUInt(), &warning))
warnings->push_back(warning);
delete rbd;
}
// Enable/Disable
foreach (BreakpointData *ebd, handler->takeEnabledBreakpoints())
if (!setBreakPointEnabledById(debugControl, ebd->bpNumber.toUInt(), true, errorMessage))
qWarning("%s\n", qPrintable(*errorMessage));
if (!setBreakPointEnabledById(debugControl, ebd->bpNumber.toUInt(), true, &warning))
warnings->push_back(warning);
foreach (BreakpointData *dbd, handler->takeDisabledBreakpoints())
if (!setBreakPointEnabledById(debugControl, dbd->bpNumber.toUInt(), false, errorMessage))
qWarning("%s\n", qPrintable(*errorMessage));
if (!setBreakPointEnabledById(debugControl, dbd->bpNumber.toUInt(), false, &warning))
warnings->push_back(warning);
if (updateMarkers)
handler->updateMarkers();
......
......@@ -73,7 +73,8 @@ struct CDBBreakPoint
static bool getBreakPoints(CIDebugControl* debugControl, QList<CDBBreakPoint> *bps, QString *errorMessage);
// Synchronize (halted) engine with BreakHandler.
static bool synchronizeBreakPoints(CIDebugControl* ctl, CIDebugSymbols *syms,
BreakHandler *bh, QString *errorMessage);
BreakHandler *bh,
QString *errorMessage, QStringList *warnings);
// Return a 'canonical' file (using '/' and capitalized drive letter)
static QString canonicalSourceFile(const QString &f);
......
......@@ -528,6 +528,10 @@ void CdbDebugEnginePrivate::clearDisplay()
bool CdbDebugEngine::startDebugger(const QSharedPointer<DebuggerStartParameters> &sp)
{
if (m_d->m_hDebuggeeProcess) {
warning(QLatin1String("Internal error: Attempt to start debugger while another process is being debugged."));
return false;
}
m_d->clearDisplay();
const DebuggerStartMode mode = m_d->m_debuggerManager->startMode();
......@@ -1268,6 +1272,8 @@ void CdbDebugEngine::selectThread(int index)
void CdbDebugEngine::attemptBreakpointSynchronization()
{
if (!m_d->m_hDebuggeeProcess) // Sometimes called from the breakpoint Window
return;
QString errorMessage;
if (!m_d->attemptBreakpointSynchronization(&errorMessage))
warning(msgFunctionFailed(Q_FUNC_INFO, errorMessage));
......@@ -1301,10 +1307,15 @@ bool CdbDebugEnginePrivate::attemptBreakpointSynchronization(QString *errorMessa
return true;
}
return CDBBreakPoint::synchronizeBreakPoints(m_cif.debugControl,
QStringList warnings;
const bool ok = CDBBreakPoint::synchronizeBreakPoints(m_cif.debugControl,
m_cif.debugSymbols,
m_debuggerManagerAccess->breakHandler(),
errorMessage);
errorMessage, &warnings);
if (const int warningsCount = warnings.size())
for (int w = 0; w < warningsCount; w++)
m_engine->warning(warnings.at(w));
return ok;
}
void CdbDebugEngine::reloadDisassembler()
......
......@@ -138,6 +138,7 @@ static ResolveSymbolResult resolveSymbol(CIDebugSymbols *syms, QString *symbol,
QStringList *matches,
QString *errorMessage)
{
errorMessage->clear();
// Is it an incomplete symbol?
if (symbol->contains(QLatin1Char('!')))
return ResolveSymbolOk;
......
......@@ -64,7 +64,10 @@ DebuggerSettings::~DebuggerSettings()
void DebuggerSettings::insertItem(int code, SavedAction *item)
{
QTC_ASSERT(!m_items.contains(code), qDebug() << code << item->toString(); return);
QTC_ASSERT(!m_items.contains(code),
qDebug() << code << item->toString(); return);
QTC_ASSERT(item->settingsKey().isEmpty() || item->defaultValue().isValid(),
qDebug() << "NO DEFAULT VALUE FOR " << item->settingsKey());
m_items[code] = item;
}
......@@ -90,9 +93,13 @@ QString DebuggerSettings::dump() const
{
QString out;
QTextStream ts(&out);
ts << "Debugger settings: ";
foreach (SavedAction *item, m_items)
ts << '\n' << item->value().toString();
ts << "Debugger settings: ";
foreach (SavedAction *item, m_items) {
QString key = item->settingsKey();
if (!key.isEmpty())
ts << '\n' << key << ": " << item->value().toString()
<< " (default: " << item->defaultValue().toString() << ")";
}
return out;
}
......@@ -171,18 +178,22 @@ DebuggerSettings *DebuggerSettings::instance()
instance->insertItem(UseDebuggingHelpers, item);
item = new SavedAction(instance);
item->setSettingsKey(debugModeGroup, QLatin1String("CustomDebuggingHelperLocation"));
instance->insertItem(UseCustomDebuggingHelperLocation, item);
item->setSettingsKey(debugModeGroup, QLatin1String("UseCustomDebuggingHelperLocation"));
item->setCheckable(true);
item->setDefaultValue(false);
instance->insertItem(UseCustomDebuggingHelperLocation, item);
item = new SavedAction(instance);
item->setSettingsKey(debugModeGroup, QLatin1String("CustomDebuggingHelperLocation"));
item->setCheckable(true);
item->setDefaultValue(QString());
instance->insertItem(CustomDebuggingHelperLocation, item);
item = new SavedAction(instance);
item->setSettingsKey(debugModeGroup, QLatin1String("DebugDebuggingHelpers"));
item->setText(tr("Debug debugging helper"));
item->setCheckable(true);
item->setDefaultValue(false);
instance->insertItem(DebugDebuggingHelpers, item);
......@@ -210,6 +221,7 @@ DebuggerSettings *DebuggerSettings::instance()
item->setCheckable(true);
item->setSettingsKey(debugModeGroup, QLatin1String("FormatHexadecimal"));
item->setChecked(true);
item->setDefaultValue(false);
item->setData(FormatHexadecimal);
instance->insertItem(FormatHexadecimal, item);
instance->m_registerFormatGroup->addAction(item);
......@@ -218,6 +230,7 @@ DebuggerSettings *DebuggerSettings::instance()
item->setText(tr("Decimal"));
item->setCheckable(true);
item->setSettingsKey(debugModeGroup, QLatin1String("FormatDecimal"));
item->setDefaultValue(false);
item->setData(FormatDecimal);
instance->insertItem(FormatDecimal, item);
instance->m_registerFormatGroup->addAction(item);
......@@ -226,6 +239,7 @@ DebuggerSettings *DebuggerSettings::instance()
item->setText(tr("Octal"));
item->setCheckable(true);
item->setSettingsKey(debugModeGroup, QLatin1String("FormatOctal"));
item->setDefaultValue(false);
item->setData(FormatOctal);
instance->insertItem(FormatOctal, item);
instance->m_registerFormatGroup->addAction(item);
......@@ -234,6 +248,7 @@ DebuggerSettings *DebuggerSettings::instance()
item->setText(tr("Binary"));
item->setCheckable(true);
item->setSettingsKey(debugModeGroup, QLatin1String("FormatBinary"));
item->setDefaultValue(false);
item->setData(FormatBinary);
instance->insertItem(FormatBinary, item);
instance->m_registerFormatGroup->addAction(item);
......@@ -242,6 +257,7 @@ DebuggerSettings *DebuggerSettings::instance()
item->setText(tr("Raw"));
item->setCheckable(true);
item->setSettingsKey(debugModeGroup, QLatin1String("FormatRaw"));
item->setDefaultValue(false);
item->setData(FormatRaw);
instance->insertItem(FormatRaw, item);
instance->m_registerFormatGroup->addAction(item);
......@@ -250,6 +266,7 @@ DebuggerSettings *DebuggerSettings::instance()
item->setText(tr("Natural"));
item->setCheckable(true);
item->setSettingsKey(debugModeGroup, QLatin1String("FormatNatural"));
item->setDefaultValue(true);
item->setData(FormatNatural);
instance->insertItem(FormatNatural, item);
instance->m_registerFormatGroup->addAction(item);
......@@ -264,40 +281,47 @@ DebuggerSettings *DebuggerSettings::instance()
item = new SavedAction(instance);
item->setSettingsKey(debugModeGroup, QLatin1String("Environment"));
item->setDefaultValue(QString());
instance->insertItem(GdbEnvironment, item);
item = new SavedAction(instance);
item->setSettingsKey(debugModeGroup, QLatin1String("ScriptFile"));
item->setDefaultValue(QString());
instance->insertItem(GdbScriptFile, item);
item = new SavedAction(instance);
item->setSettingsKey(debugModeGroup, QLatin1String("AutoQuit"));
item->setText(tr("Automatically quit debugger"));
item->setCheckable(true);
item->setDefaultValue(false);
instance->insertItem(AutoQuit, item);
item = new SavedAction(instance);
item->setSettingsKey(debugModeGroup, QLatin1String("UseToolTips"));
item->setText(tr("Use tooltips when debugging"));
item->setCheckable(true);
item->setDefaultValue(false);
instance->insertItem(UseToolTips, item);
item = new SavedAction(instance);
item->setSettingsKey(debugModeGroup, QLatin1String("ListSourceFiles"));
item->setText(tr("List source files"));
item->setCheckable(true);
item->setDefaultValue(false);
instance->insertItem(ListSourceFiles, item);
item = new SavedAction(instance);
item->setSettingsKey(debugModeGroup, QLatin1String("SkipKnownFrames"));
item->setText(tr("Skip known frames"));
item->setCheckable(true);
item->setDefaultValue(false);
instance->insertItem(SkipKnownFrames, item);
item = new SavedAction(instance);
item->setSettingsKey(debugModeGroup, QLatin1String("EnableReverseDebugging"));
item->setText(tr("Enable reverse debugging"));
item->setCheckable(true);
item->setDefaultValue(false);
instance->insertItem(EnableReverseDebugging, item);
item = new SavedAction(instance);
......@@ -307,14 +331,17 @@ DebuggerSettings *DebuggerSettings::instance()
item = new SavedAction(instance);
item->setSettingsKey(debugModeGroup, QLatin1String("SelectedPluginBreakpoints"));
item->setDefaultValue(false);
instance->insertItem(SelectedPluginBreakpoints, item);
item = new SavedAction(instance);
item->setSettingsKey(debugModeGroup, QLatin1String("NoPluginBreakpoints"));
item->setDefaultValue(false);
instance->insertItem(NoPluginBreakpoints, item);
item = new SavedAction(instance);
item->setSettingsKey(debugModeGroup, QLatin1String("SelectedPluginBreakpointsPattern"));
item->setDefaultValue(QString(".*"));
instance->insertItem(SelectedPluginBreakpointsPattern, item);
item = new SavedAction(instance);
......
......@@ -355,17 +355,19 @@ QWidget *DebuggingHelperOptionPage::createPage(QWidget *parent)
this, SLOT(updateState()));
m_group.clear();
#ifdef QT_DEBUG
m_group.insert(theDebuggerAction(UseDebuggingHelpers),
m_ui.checkBoxUseDebuggingHelpers);
#endif
m_group.insert(theDebuggerAction(UseCustomDebuggingHelperLocation),
m_ui.checkBoxUseCustomDebuggingHelperLocation);
m_group.insert(theDebuggerAction(CustomDebuggingHelperLocation),
m_ui.dumperLocationChooser);
#ifdef QT_DEBUG
m_group.insert(theDebuggerAction(DebugDebuggingHelpers),
m_ui.checkBoxDebugDebuggingHelpers);
#else
m_ui.checkBoxDebugDebuggingHelpers->hide();
#endif
m_ui.dumperLocationChooser->
setEnabled(theDebuggerAction(UseCustomDebuggingHelperLocation)->value().toBool());
......
......@@ -14,5 +14,13 @@ CONFIG += debug
QMAKE_CXXFLAGS *= -O2
}
true {
DEFINES += USE_QT_GUI=0
QT = core
} else {
DEFINES += USE_QT_GUI=1
QT = core gui
}
SOURCES += ../../../share/qtcreator/gdbmacros/gdbmacros.cpp
......@@ -113,13 +113,13 @@ static const QString tooltipIName = _("tooltip");
GdbEngine::GdbEngine(DebuggerManager *parent) :
#ifdef Q_OS_WIN // Do injection loading with MinGW (call loading does not work with 64bit)
m_dumperInjectionLoad(true)
m_dumperInjectionLoad(true),
#else
m_dumperInjectionLoad(false)
m_dumperInjectionLoad(false),
#endif
q(parent),
qq(parent->engineInterface())
{
q = parent;
qq = parent->engineInterface();
m_stubProc.setMode(Core::Utils::ConsoleProcess::Debug);
#ifdef Q_OS_UNIX
m_stubProc.setSettings(Core::ICore::instance()->settings());
......@@ -200,6 +200,26 @@ void GdbEngine::initializeVariables()
m_autoContinue = false;
m_waitingForFirstBreakpointToBeHit = false;
m_commandsToRunOnTemporaryBreak.clear();
m_cookieForToken.clear();
m_customOutputForToken.clear();
m_pendingConsoleStreamOutput.clear();
m_pendingTargetStreamOutput.clear();
m_pendingLogStreamOutput.clear();
m_inbuffer.clear();
m_address.clear();
m_currentFunctionArgs.clear();
m_currentFrame.clear();
m_dumperHelper = QtDumperHelper();
// FIXME: unhandled:
//m_outputCodecState = QTextCodec::ConverterState();
//OutputCollector m_outputCollector;
//QProcess m_gdbProc;
//QProcess m_uploadProc;
//Core::Utils::ConsoleProcess m_stubProc;
}
void GdbEngine::gdbProcError(QProcess::ProcessError error)
......@@ -2838,7 +2858,7 @@ static void setWatchDataSAddress(WatchData &data, const GdbMi &mi)
void GdbEngine::setUseDebuggingHelpers(const QVariant &on)
{
qDebug() << "SWITCHING ON/OFF DUMPER DEBUGGING:" << on;
//qDebug() << "SWITCHING ON/OFF DUMPER DEBUGGING:" << on;
// FIXME: a bit too harsh, but otherwise the treeview sometimes look funny
//m_expandedINames.clear();
setTokenBarrier();
......@@ -3188,7 +3208,8 @@ void GdbEngine::handleQueryDebuggingHelper(const GdbResultRecord &record, const
m_dumperHelper.parseQueryTypes(availableSimpleDebuggingHelpers, QtDumperHelper::GdbDebugger);
if (availableSimpleDebuggingHelpers.isEmpty()) {
m_debuggingHelperState = DebuggingHelperUnavailable;
if (!m_dumperInjectionLoad) // Retry if thread has not terminated yet.
m_debuggingHelperState = DebuggingHelperUnavailable;
q->showStatusMessage(tr("Debugging helpers not found."));
//QMessageBox::warning(q->mainWindow(),
// tr("Cannot find special data dumpers"),
......@@ -3523,7 +3544,8 @@ void GdbEngi