Seite 1 von 2
GTK Memory probleme (Memory leak?)
Verfasst: Mo Jun 16, 2014 8:53 pm
von BNR3108
Hallo an alle im Forum,
Das ist mein erster Post hier
Ich habe folgendes Problem bei dem ihr mir hoffentlich helfen könnt.
Mein Problem ist folgendes:
Ich habe mir für meinen 3D Drucker, mit GTK in C ein Programm geschrieben welches die Maschinencodes an den Drucker schickt. Das Programm ist recht einfach aufgebaut. Eine Textdatei wird zeilenweise mittels Filestream und fgets() an die Serielle übertragen und in einem GTK_Entry ausgegeben. Zusätzlich wird noch eine Progressbar gefüllt um die Position in der Datei anzuzeigen. Damit die GUI während des Sendens benutzbar bleibt geschieht das ganze in einem mit Pthreads erzeugten Thread. Das funktioniert auch alles soweit wunderbar, nur habe ich nun bemerkt das sobald der Thread läuft und das GTK_Entry mittels gtk_entry_set_text() und die Progressbar mit gtk_progress_set_value() aktualisiert wird, der Speicherbedarf des Programms immer weiter ansteigt.

Überprüft habe ich das mit dem Windows Taskmanager. Das geht so weit bis das Programm weit über 100MB einnimmt.
Wenn ich gtk_entry_set_text() und gtk_progress_set_value() auskommentiere ist das "starke" Speicherwachstum weg.
Man kann das Problem auch reproduzieren indem man ein gtk_entry_set_text() oder gtk_progress_set_value() in eine Buttoncallback-Funktion kopiert und dann paar mal auf den Button drückt. Man kann dann sehr schön sehen wie das Programm "wächst"

(ganz langsam natürlich).
zusätzlich ist mir jetzt auch noch aufgefallen, das selbst wenn man garnichts macht, also nur in der gtk_main() auf irgendein Ereignis wartet, der Speicher der für das Programm benutzt wird immer weiter anwächst.
Wie kann das sein?
Kann mir jemand erklären was da los ist? Kennt jemand diese Probleme? Und was kann man dagegen tun?
Wäre wirklich klasse wenn mir jemand helfen kann!
vielen dank schonmal im voraus
Lg BNR
Re: GTK Memory probleme (Memory leak?)
Verfasst: Di Jun 17, 2014 6:26 am
von cloidnerux
Hi und Willkommen im Forum
Das geht so weit bis das Programm weit über 100MB einnimmt.
Wenn ich gtk_entry_set_text() und gtk_progress_set_value() auskommentiere ist das "starke" Speicherwachstum weg.
Jop, das hört sich nach einem Speicherleck an. Sowas passiert, wenn dynamisch Speicher angefordert wird, ohne ihn wieder frei zu geben.
Aber ohne deinen Code, kann man nicht sagen was du im speziellen Falsch machst.
Re: GTK Memory probleme (Memory leak?)
Verfasst: Di Jun 17, 2014 10:12 am
von oenone
Genau, poste mal ein Minimalbeispiel, am Besten das von dir beschriebene mit dem Button.
Außerdem bitte die GTK+ Version.
Re: GTK Memory probleme (Memory leak?)
Verfasst: Di Jun 17, 2014 12:19 pm
von BNR3108
Hallo,
Sobald ich heute zuhause bin, bereite ich mal ein kleines Codebeispiel vor was dann
hoffe ich den gleichen effekt auslöst.
danke schonmal für eure Antworten
lg BNR
Re: GTK Memory probleme (Memory leak?)
Verfasst: Di Jun 17, 2014 6:24 pm
von BNR3108
Hallo,
So ich hab nun mal schnell ein kleines Testprogramm
zusammengebastelt.
Ist nicht besonders schön aber der Effekt ist da!
Hab das Programm mal in den Anhang gepackt. Einfach das Programm starten, auf "start" klicken und
das memory Wachstum im Windows-Taskmanager beobachten. (GTK Runtime muss installiert sein)
Ich verwende übrigens Gtk+ 2.24.10
Bei meinem 3d-Drucker Programm habe ich übrigens bemerkt das ab 100MB der Speicherverbrauch nicht mehr weiter ansteigt. Mal fällt er wieder zurück und mal wird es etwas mehr aber im Schnitt bleibt es bei 100MB.
Bedeutet das nun das doch alles ok ist?
Hier nochmal der Quellcode des Testprogramms:
Code: Alles auswählen
#include <stdlib.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <pthread.h>
#include <glib.h>
#include <windows.h>
pthread_t TimerThread;
int TimerThreadRun;
struct WidgetStruct
{
GtkWidget *MainWindow,
*WindowVbox,
*StartButton,
*Textbox,
*Progressbar;
};
static void *ThreadFunction(struct WidgetStruct *Widgets)
{
unsigned char Counter = 0;
unsigned int ProgressValue = 0;
char Buffer[20] = "";
while(TimerThreadRun)
{
sprintf(Buffer,"%d",Counter);
gdk_threads_enter();
gtk_entry_set_text(Widgets->Textbox, Buffer);
gtk_progress_bar_set_text(Widgets->Progressbar, Buffer);
gtk_progress_set_value(GTK_PROGRESS(Widgets->Progressbar), ProgressValue);
gdk_threads_leave();
Counter++;
if(Counter==0) //bei überlauf von Counter, ProgressValue++
ProgressValue++;
if(ProgressValue>100)
ProgressValue=0;
printf("%d\n",Counter);
Sleep(50);
}
return NULL;
}
void cbStartButton(GtkWidget *Button, struct WidgetStruct *Widgets)
{
if(!TimerThreadRun)
{
if(pthread_create( &TimerThread, NULL, &ThreadFunction, Widgets ) != 0)
{
printf("Konnte Thread nicht erzeugen\n");
return EXIT_FAILURE;
}
else
{
TimerThreadRun = 1;
printf("SendThread Erzeugt!\n");
}
}
else
{
TimerThreadRun = 0;
}
}
///////////////////////////////////////////////////////
int main(int argc, char** argv)
{
struct WidgetStruct MainWidgets;
g_thread_init (NULL);
gdk_threads_init ();
gdk_threads_enter ();
gtk_init(&argc, &argv);
////////MainWindow//////////
MainWidgets.MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
MainWidgets.WindowVbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(MainWidgets.MainWindow), MainWidgets.WindowVbox);
MainWidgets.Textbox = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(MainWidgets.WindowVbox), MainWidgets.Textbox,FALSE,FALSE,0);
MainWidgets.Progressbar = gtk_progress_bar_new();
gtk_box_pack_start(GTK_BOX(MainWidgets.WindowVbox), MainWidgets.Progressbar,FALSE,FALSE,0);
MainWidgets.StartButton = gtk_button_new_with_label("Start");
gtk_box_pack_end(GTK_BOX(MainWidgets.WindowVbox), MainWidgets.StartButton,FALSE,FALSE,0);
gtk_widget_show_all(MainWidgets.MainWindow);
///////Signals Connecting/////////////////
g_signal_connect(MainWidgets.MainWindow, "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(MainWidgets.StartButton, "clicked", G_CALLBACK(cbStartButton), &MainWidgets);
gtk_main();
gdk_threads_leave ();
return 0;
}
Lg BNR
Edit by cloidnerux: Code-Tags
Re: GTK Memory probleme (Memory leak?)
Verfasst: Di Jun 17, 2014 7:34 pm
von BNR3108
Ich nochmal,
Das mit den 100MB muss ich zurücknehmen
Das Programm benötigt doch immer mehr und mehr Speicher...
LG BNR
Re: GTK Memory probleme (Memory leak?)
Verfasst: Mi Jun 18, 2014 8:50 am
von oenone
Also unter Linux existiert definitiv kein Memory Leak. Der Speicherverbrauch ist ab Klick auf den Button konstant. Source Code fast identisch zu deinem (Sleep durch nanosleep ausgetauscht, windows.h entfernt, veraltetes g_thread_init entfernt, Typ vom Parameter zu ThreadFunction zu void* geändert, ein paar Casts hinzugefügt um Warnings zu entfernen).
Edit: Einige Memory-Leaks in GTK für Windows sollen in Version 2.24.14 gefixt sein. Update mal deine Installation.
https://bugzilla.gnome.org/show_bug.cgi?id=685959
Ist also ein bekanntes Problem. Meine Empfehlung: GTK nur für Linux verwenden, da Windows von den Devs wenig Zuwendung bekommt. Für Cross-Platform ist meiner Meinung nach Qt die bessere Wahl.
Re: GTK Memory probleme (Memory leak?)
Verfasst: So Jun 22, 2014 10:21 am
von BNR3108
Vielen dank für die Antwort,
Werde jetzt wohl oder übel auf Qt umsteigen müssen.
Mfg
BNR
Re: GTK Memory probleme (Memory leak?)
Verfasst: Mi Jun 25, 2014 10:57 am
von Xin
BNR3108 hat geschrieben:Das mit den 100MB muss ich zurücknehmen
Das Programm benötigt doch immer mehr und mehr Speicher...
In welchem Rahmen bewegt sich das denn?
Re: GTK Memory probleme (Memory leak?)
Verfasst: Mi Jun 25, 2014 5:54 pm
von BNR3108
also es sind so ca. 80 MB pro Stunde.
Ich habs mal eine ganze weile auf Arbeit laufen lassen und die 700 MB geknackt.
Wenn es ein Programm wäre was man nur mal kurz laufen lässt wäre es nicht so wild,
aber der 3D Drucker lauft schon mal 4-5 Stunden am Stück...
Grüße BNR