Problem with QObject::dumpObjectTree() on ubuntu 9.10
-
Hello everybody!
I'm somewhat of a novice to Qt and I'm trying to learn it using an Ubuntu 9.10 box. I've done a fair amount of google search and tried different things before posting this thread, so as not to bother people needlessly. However, after several hours of frustration, I could not get dumpObjectTree() to produce anything for a simple console app (even QDebug is not working). I've looked thru my Qt libs and I don't see anything with a dbg ending (or anything roughly similar that). Somewhere I found a post where there was a hint that there may be some limitations using Qtdebug libraries on Linux.
Among the things I've tried:
- added CONFIG += debug to .pro file
- added CONFIG += release_and_debug to .pro file
- installed the libqt4-dbg using Synaptic
Even when I used QtCreator on debug mode I could not get any response from dumpObjectTree().
So it seems to me that there is either something basically wrong with my procedure (unlikely I think) or I'm not using the appropriate libraries.
Could anybody give me a hint on how to go about this?
Thanks!
-
I use Ubuntu 10.04 and Qt 4.7.0 snapshot version compiled from source code, dumpObjectTree works well. eg:
@int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.setWindowFlags(Qt::WindowStaysOnTopHint);
w.dumpObjectTree();
w.show();return a.exec();
}
@output:
@
MainWindow::MainWindow
QMainWindowLayout::_layout
QRubberBand::qt_rubberband
QMenuBar::menuBar
QToolButton::qt_menubar_ext_button
QToolBar::mainToolBar
QToolBarLayout::
QToolBarExtension::qt_toolbar_ext_button
QAction::
QWidget::centralWidget
QStatusBar::statusBar
QSizeGrip::
QHBoxLayout::
QVBoxLayout::
QHBoxLayout::
@1.If you are using Qt creator, use debug Build
2.Try compiling Qt from source / use the Nokia released version instead of distribution version. -
Thanks for the reply.
I've downloaded the latest Qt SDK using this link
http://qt.nokia.com/downloads/sdk-linux-x11-32bit-cpp (http://get.qt.nokia.com/qtsdk/qt-sdk-linux-x86-opensource-2010.04.bin)I tried using the debug build and it didn't work!
I also copied all the lib*.so.4.6.1.debug files from /usr/local/Trolltech/Qt-4.6.1/lib to my /usr/lib folder and renamed them *_debug.so and altered the Makefile to use only the now created libQtCore_debug.so library. It also didn't work!
I tried to find the source code for the latest Qt SDK (or even the framework only) from the Nokia site, but I could only find pre-compiled binaries.
Since the example that I'm tried to run is so simple (no GUI only console) I'm almost certain that I have a library compatibility problem OR I'm not using some requeired compiler/linker flags (unlikely).
I'm almost giving up on getting dumpObjectTree and QDebug to run on my Ubuntu 9.10!
Thanks for the attention!
-
Can you post the .pro and example .cpp files?
Also try Qt 4.7.0 RC1 available here:
"Qt prerelease downloads":http://qt.nokia.com/developer/qt-qtcreator-prerelease
"Qt 4.7.0 RC1 Src":http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.7.0-rc1.tar.gz -
The example is a simple one based on the web available notes by Ezust, really basic stuff!
1)Below are the .pro and cpp/h files I used with Eclipse:1.a)
######################################################################Automatically generated by qmake (2.01a) Tue Sep 14 15:39:04 2010
######################################################################
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
LIBS = -L/usr/local/Trolltech/Qt-4.6.1/lib
#CONFIG += debug_and_release
CONFIG += debugInput
HEADERS += Personna.h
SOURCES += main.cpp Personna.cpp1.b)main.cpp
/*
- main.cpp
- Created on: Sep 14, 2010
-
Author: ben
*/
#include <QTextStream>
#include <QDebug>
#include "Personna.h"static QTextStream cout(stdout, QIODevice::WriteOnly);
void showTree(QObject* theparent){
foreach(QObject* const person, theparent->children()){
if(person->parent()==theparent){
cout << "Member: "<<person->objectName()<<" - Parent:"<<theparent->objectName()<<endl;
showTree(person);
}
}
}
int main(int , char**) {
cout << "First we create a bunch of objects." << endl;
Personna bunch(0, "A Stack Object");
/* other objects are created on the heap */
Personna *mike = new Personna(&bunch, "Mike");
Personna *carol = new Personna(&bunch, "Carol");
new Personna(mike, "Greg");
new Personna(mike, "Peter");
new Personna(mike, "Bobby");
new Personna(carol, "Marcia");
new Personna(carol, "Jan");
new Personna(carol, "Cindy");
Personna *alice=new Personna(0, "Alice");
new Personna(alice, "King");
new Personna(alice, "Queen");cout << "\nDisplay the list using QObject::dumpObjectTree()" << endl; bunch.dumpObjectTree(); QDebug(&QString(" QDebug() called!")); showTree(&bunch); showTree(alice); cout << "\nProgram finished - destroy all objects." << endl; return 0;
}
1.c) Personna.cpp
/*- Personna.cpp
- Created on: Sep 14, 2010
-
Author: ben
*/
#include "Personna.h"
#include <QTextStream>static QTextStream cout(stdout, QIODevice::WriteOnly);
Personna::Personna(QObject* parent, QString name)
: QObject(parent) {
setObjectName(name);
cout << QString("Constructing Person: %1").arg(name) << endl;
}
Personna::~Personna() {
cout << QString("Destroying Person: %1").arg(objectName()) <<
endl;
}
1.d) Personna.h
/*- Personna.h
- Created on: Sep 14, 2010
-
Author: ben
*/
#ifndef PERSONNA_H_
#define PERSONNA_H_#include <QObject>
#include <QString>class Personna : public QObject{
public:
Personna(QObject* parent, QString name);
virtual ~Personna();
};#endif /* PERSONNA_H_ */
2)Below is the .pro file I used with QtCreator(latest linux binary release) (The cpp/h files are the same as above):
#-------------------------------------------------Project created by QtCreator 2010-09-15T00:42:26
#-------------------------------------------------
QT += core
QT -= gui
TARGET = qobj
CONFIG += console
CONFIG -= app_bundle
CONFIG += debugTEMPLATE = app
SOURCES += main.cpp
personna.cppHEADERS +=
personna.h -
Would you mind adding some code tags? Your comment is hardly readable right now.
-
Trying again!
The example is a simple one based on the web available notes by Ezust (I changed slightly the code), really basic stuff!
1)Below are the .pro and cpp/h files I used with Eclipse:1.a)
@
######################################################################-
Automatically generated by qmake (2.01a) Tue Sep 14 15:39:04 2010
######################################################################
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
LIBS = -L/usr/local/Trolltech/Qt-4.6.1/lib
#CONFIG += debug_and_release
CONFIG += debug
Input
HEADERS += Personna.h SOURCES += main.cpp Personna.cpp
@
1.b)main.cpp
@/* * main.cpp * * Created on: Sep 14, 2010 * Author: ben */ #include “Personna.h” static QTextStream cout(stdout, QIODevice::WriteOnly);
void showTree(QObject* theparent){
foreach(QObject* const person, theparent->children()){
cout << "Member: "<< person->objectName()<<" - Parent:"<<theparent->objectName()<<endl;
showTree(person);
}
}int main(int , char**) {
cout << “First we create a bunch of objects.” << endl;
Personna bunch(0, “A Stack Object”);
/* other objects are created on the heap */
Personna *mike = new Personna(&bunch, “Mike”);
Personna *carol = new Personna(&bunch, “Carol”);
new Personna(mike, “Greg”);
new Personna(mike, “Peter”);
new Personna(mike, “Bobby”);
new Personna(carol, “Marcia”);
new Personna(carol, “Jan”);
new Personna(carol, “Cindy”);
Personna *alice=new Personna(0, “Alice”);
new Personna(alice, “King”);
new Personna(alice, “Queen”);
cout << ”\nDisplay the list using QObject::dumpObjectTree()” << endl;
bunch.dumpObjectTree();
QDebug(&QString(” QDebug() called!”));
showTree(&bunch);
showTree(alice);
cout << ”\nProgram finished – destroy all objects.” << endl;
//alice leaks on purpose
return 0;}
@
1.c) Personna.cpp
@
/* * Personna.cpp * * Created on: Sep 14, 2010 * Author: ben */ #include “Personna.h” static QTextStream cout(stdout, QIODevice::WriteOnly); Personna::Personna(QObject* parent, QString name) : QObject(parent) { setObjectName(name); cout << QString(“Constructing Person: %1”).arg(name) << endl; } Personna::~Personna() { cout << QString(“Destroying Person: %1”).arg(objectName()) << endl; }
@
1.d) Personna.h
@/* * Personna.h * * Created on: Sep 14, 2010 * Author: ben */ #ifndef PERSONNA_H_ #define PERSONNA_H_ class Personna : public QObject{ public: Personna(QObject* parent, QString name);
virtual ~Personna();
}; #endif /* PERSONNA_H_ */
@
2)Below is the .pro file I used with QtCreator(latest linux binary release) (The cpp/h files are the same as above):@
#————————————————————————- #Project created by QtCreator 2010-09-15T00:42:26 # #————————————————————————- QT += core QT -= gui TARGET = qobj CONFIG += console CONFIG -= app_bundle CONFIG += debug TEMPLATE = app SOURCES += main.cpp \ personna.cpp HEADERS += \ personna.h
@
-
-
This is the output I get:
@
First we create a bunch of objects.
Constructing Person: A Stack Object
Constructing Person: Mike
Constructing Person: Carol
Constructing Person: Greg
Constructing Person: Peter
Constructing Person: Bobby
Constructing Person: Marcia
Constructing Person: Jan
Constructing Person: Cindy
Constructing Person: Alice
Constructing Person: King
Constructing Person: QueenDisplay the list using QObject::dumpObjectTree()
Member: Mike - Parent:A Stack Object
Member: Greg - Parent:Mike
Member: Peter - Parent:Mike
Member: Bobby - Parent:Mike
Member: Carol - Parent:A Stack Object
Member: Marcia - Parent:Carol
Member: Jan - Parent:Carol
Member: Cindy - Parent:Carol
Member: King - Parent:Alice
Member: Queen - Parent:AliceProgram finished - destroy all objects.
Destroying Person: A Stack Object
Destroying Person: Mike
Destroying Person: Greg
Destroying Person: Peter
Destroying Person: Bobby
Destroying Person: Carol
Destroying Person: Marcia
Destroying Person: Jan
Destroying Person: Cindy@
-
I get the following correct output:
@
First we create a bunch of objects.
Constructing Person: A Stack Object
Constructing Person: Mike
Constructing Person: Carol
Constructing Person: Greg
Constructing Person: Peter
Constructing Person: Bobby
Constructing Person: Marcia
Constructing Person: Jan
Constructing Person: Cindy
Constructing Person: Alice
Constructing Person: King
Constructing Person: QueenDisplay the list using QObject::dumpObjectTree()
Member: Mike - Parent:A Stack Object
Member: Greg - Parent:Mike
Member: Peter - Parent:Mike
Member: Bobby - Parent:Mike
Member: Carol - Parent:A Stack Object
Member: Marcia - Parent:Carol
Member: Jan - Parent:Carol
Member: Cindy - Parent:Carol
Member: King - Parent:Alice
Member: Queen - Parent:AliceProgram finished – destroy all objects.
Destroying Person: A Stack Object
Destroying Person: Mike
Destroying Person: Greg
Destroying Person: Peter
Destroying Person: Bobby
Destroying Person: Carol
Destroying Person: Marcia
Destroying Person: Jan
Destroying Person: Cindy
QObject::A Stack Object
QObject::Mike
QObject::Greg
QObject::Peter
QObject::Bobby
QObject::Carol
QObject::Marcia
QObject::Jan
QObject::Cindy@
Can you install 4.7.0 RC1 binary from the above links and try?
-
I tried with 4.7.0 RC1 binary and it didn't work. Below is my hand altered Makefile where I pointed everything to the newly installed Qt.
@
#############################################################################Makefile for building: qobject
Generated by qmake (2.01a) (Qt 4.5.2) on: Thu Sep 16 08:14:35 2010
Project: qobject.pro
Template: app
Command: /usr/bin/qmake -unix -o Makefile qobject.pro
#############################################################################
####### Compiler, tools and options
CC = gcc
CXX = g++
DEFINES = -DQT_DEBUG -DQT_CORE_LIB
CFLAGS = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)
CXXFLAGS = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)
INCPATH = -I/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/linux-g++ -I. -I../../../Qt/qtsdk-2010.05/qt/include/QtCore -I/usr/include/qt4 -I. -I../../../Qt/qtsdk-2010.05/qt/include -I.
LINK = g++
LFLAGS = -Wl,-O1
LIBS = $(SUBLIBS) -L/home/ben/Qt/qtsdk-2010.05/lib -lQtCore -lpthread
AR = ar cqs
RANLIB =
QMAKE = /home/ben/Qt/qtsdk-2010.05/qt/bin/qmake
TAR = tar -cf
COMPRESS = gzip -9f
COPY = cp -f
SED = sed
COPY_FILE = $(COPY)
COPY_DIR = $(COPY) -r
INSTALL_FILE = install -m 644 -p
INSTALL_DIR = $(COPY_DIR)
INSTALL_PROGRAM = install -m 755 -p
DEL_FILE = rm -f
SYMLINK = ln -sf
DEL_DIR = rmdir
MOVE = mv -f
CHK_DIR_EXISTS= test -d
MKDIR = mkdir -p####### Output directory
OBJECTS_DIR = ./
####### Files
SOURCES = main.cpp
Personna.cpp
OBJECTS = main.o
Personna.o
DIST = /home/ben/Qt/qtsdk-2010.05/qt/mkspecs/common/g++.conf
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/common/unix.conf
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/common/linux.conf
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/qconfig.pri
......
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/features/lex.prf
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/features/include_source_dir.prf
qobject.pro
QMAKE_TARGET = qobject
DESTDIR =
TARGET = qobject......
####### Build rules
all: Makefile $(TARGET)
$(TARGET): $(OBJECTS)
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)Makefile: qobject.pro /home/ben/Qt/qtsdk-2010.05/qt/mkspecs/linux-g++/qmake.conf /home/ben/Qt/qtsdk-2010.05/qt/mkspecs/common/g++.conf
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/common/unix.conf
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/common/linux.conf
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/qconfig.pri
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/features/qt_functions.prf
......
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/features/lex.prf
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/features/include_source_dir.prf
/home/ben/Qt/qtsdk-2010.05/qt/lib/libQtGui.prl
/home/ben/Qt/qtsdk-2010.05/qt/lib/libQtCore.prl
$(QMAKE) -unix -o Makefile qobject.pro
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/common/g++.conf:
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/common/unix.conf:
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/common/linux.conf:
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/qconfig.pri:
......
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/features/lex.prf:
/home/ben/Qt/qtsdk-2010.05/qt/mkspecs/features/include_source_dir.prf:
/home/ben/Qt/qtsdk-2010.05/qt/lib/libQtGui.prl:
/home/ben/Qt/qtsdk-2010.05/qt/lib/libQtCore.prl:
qmake: FORCE
@$(QMAKE) -unix -o Makefile qobject.prodist:
@$(CHK_DIR_EXISTS) .tmp/qobject1.0.0 || $(MKDIR) .tmp/qobject1.0.0
$(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/qobject1.0.0/ && $(COPY_FILE) --parents Personna.h .tmp/qobject1.0.0/ && $(COPY_FILE) --parents main.cpp Personna.cpp .tmp/qobject1.0.0/ && (cddirname .tmp/qobject1.0.0
&& $(TAR) qobject1.0.0.tar qobject1.0.0 && $(COMPRESS) qobject1.0.0.tar) && $(MOVE)dirname .tmp/qobject1.0.0
/qobject1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/qobject1.0.0clean:compiler_clean
-$(DEL_FILE) $(OBJECTS)
-$(DEL_FILE) *~ core *.core####### Sub-libraries
distclean: clean
-$(DEL_FILE) $(TARGET)
-$(DEL_FILE) Makefilemocclean: compiler_moc_header_clean compiler_moc_source_clean
mocables: compiler_moc_header_make_all compiler_moc_source_make_all
compiler_moc_header_make_all:
compiler_moc_header_clean:
compiler_rcc_make_all:
compiler_rcc_clean:
compiler_image_collection_make_all: qmake_image_collection.cpp
compiler_image_collection_clean:
-$(DEL_FILE) qmake_image_collection.cpp
compiler_moc_source_make_all:
compiler_moc_source_clean:
compiler_uic_make_all:
compiler_uic_clean:
compiler_yacc_decl_make_all:
compiler_yacc_decl_clean:
compiler_yacc_impl_make_all:
compiler_yacc_impl_clean:
compiler_lex_make_all:
compiler_lex_clean:
compiler_clean:####### Compile
main.o: main.cpp Personna.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cppPersonna.o: Personna.cpp Personna.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o Personna.o Personna.cpp####### Install
install: FORCE
uninstall: FORCE
FORCE:
@