Profiling mit gprof



  • Hallo,

    ich hoffe mal dass das hier das richtige Forum für meine Frage ist:

    Ich möchte bei meinem Programm feststellen, welche Funktion wie lange braucht. Dazu wollte ich gprof verwenden. Ich habe also in mein Makefile unter CFLAGS und CXXFLAGS jeweils -pg eingetragen, also

    CC            = gcc
    CXX           = g++
    DEFINES       = -D_TTY_POSIX_ -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED
    CFLAGS        = -pipe -g -Wall -pg -W -D_REENTRANT $(DEFINES)
    CXXFLAGS      = -pipe -g -Wall -pg -W -D_REENTRANT $(DEFINES)
    

    Leider wird einfach keine gmon.out Datei erstellt. Ohne kann ich natürlich auch kein profiling machen. Was könnte das Problem sein? Gibt es vielleicht konkurierende Parameter?



  • Hast du das -pg auch beim Linken angegeben (also in LDFLAGS o.ä.)?



  • Ich habe das Makefile automatisch mit qmake generieren lassen. Wenn ich das nicht total falsch interpretiere, werden die CXXFLAS auch für das Linken verwendet:

    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp
    


  • Gh0str1d3r schrieb:

    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp
    

    Das ist noch nicht der Linkeraufruf. Der Linker kommt erst im nächsten Schritt, wenn dann aus den einzelnen Object-Files (.o) das fertige Binary gebaut wird. Das wird in deinem Makefile ein eigenes Target sein, und da muß dann das -pg auch als Parameter mit rein.



  • ok, du hast Recht. Ich habe jetzt in die .pro Datei am Anfang folgendes geschrieben

    QMAKE_CFLAGS += -pg
    QMAKE_CXXFLAGS += -pg
    QMAKE_LFLAGS += -pg
    

    was auch bewirkt, dass jetzt auch LFLAGS = -pg gesetzt ist. Ein gmon.out wird trotzdem nicht erstellt.



  • Ich kenne mich mit qmake leider nicht aus. Kannst du irgendwie überprüfen, ob gcc wirklich sowohl beim Kompilieren als auch beim Linken mit -pg aufgerufen wird?

    Ansonsten, die gmon.out wird nur erstellt, wenn das Programm "sauber" beendet wird (z.B. kein Segfault o.ä.). Und das Verzeichnis, aus dem du das Programm startest, muß natürlich schreibbar sein, aber das versteht sich ja eigentlich von selbst.



  • Das sind die letzten beiden Zeiten der Compilermeldungen:

    g++ -c -pipe -pg -g -Wall -W -D_REENTRANT -D_TTY_POSIX_ -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I../../share/qt4/mkspecs/linux-g++ -I. -I../../include/qt4/QtCore -I../../include/qt4/QtCore -I../../include/qt4/QtGui -I../../include/qt4/QtGui -I../../include/qt4 -I../../include/qt4/qextserialport -I../../include/qwt5 -I. -I. -o moc_CalibrationThread.o moc_CalibrationThread.cpp
    g++ -pg -o moke AStartDialog.o Auswertung.o Calculate.o Calibration.o Gaussmeter.o LockIn.o Messung.o MokeData.o MStartDialog.o OneLoop.o PlotDialog.o PowerSupply.o main.o MainWindow.o IOWcontrol.o InternalData.o CalibrationCalculate.o CalibrationData.o CalibrationThread.o SymmetrizeFiles.o moc_AStartDialog.o moc_Auswertung.o moc_Calibration.o moc_Messung.o moc_MokeData.o moc_MStartDialog.o moc_OneLoop.o moc_PlotDialog.o moc_MainWindow.o moc_CalibrationThread.o -L/usr/lib64/qt4 -lqextserialport -lqwt -liowkit -lQtGui -L/usr/lib64 -L/usr/lib64/qt4 -L/usr/lib -lpng -lSM -lICE -lXrender -lXrandr -lXfixes -lXcursor -lfreetype -lfontconfig -lXext -lX11 -lQtCore -lz -lm -lrt -ldl -lpthread
    

    Die -pg Option hat er also geschluckt. Die eingebundenen Qt Quellen sind natürlich nicht mit dieser Option compiliert, aber das sollte doch nur bedeuten, dass ich deren Rechenzeit nicht sehen kann, und nicht, dass das Profiling überhaupt nicht funktioniert, oder?



  • Ich bin jetzt umgestiegen auf KCacheGrind, das funktioniert wunderbar.

    Für KDevelop user: zu finden unter Debuggen. Braucht keine extra Compilerflags



  • @Gh0str1d3r hast du ne multithreading anwendung?
    wenn ja, analysiert KCacheGrind alle threads?

    gprof hat bei mir immer nur den hauptthread analysiert, habs aber auch nicht sooo lang probiert.


Anmelden zum Antworten