Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Mal so 'ne Frage

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.11.2003, 08:57 Uhr
HRI-Dummy



Hallo allerseits!

Mein Client Programm ist jetzt so gut wie fertig und es laueft bis zum Programm ende in jedem Fall fehlerfrei durch.
Eins verstehe ich allerdings nicht. Wenn ich mir mehr als 7 columns pro result set (die Anzahl der result sets ist egal, komischerweise) aus der Datenbank hole, laeuft das Programm zwar immer noch bis zum Ende komplett sauber durch, aber nach beenden des Programms kriege ich einen segmentation fault. An meiner Speicherverwaltung kann es eigentlich nicht liegen, weil ich mit printf-Ausgaben getestet habe, wie weit das Programm laeft und er gibt zum Schluss allen Speicher wieder frei ohne Fehler zu produzieren, erst danach gibt es den segfault.
Ist es moeglich, das ich vielleicht mehr Speicher in Anspruch nehme, als ich auf dem Rechner zur Verfuegung habe oder wie soll ich mir das erklaeren?
Falls der Fehler doch im Programm liegt, wie kann ich ihn einkreisen?
Bisher habe ich das immer mit printf hingekriegt, aber in diesem Fall hilft mir das ueberhaupt nicht weiter.
Waere super, wenn jemand eine Antwort parat haette!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.11.2003, 09:47 Uhr
virtual
Sexiest Bit alive
(Operator)


Wenn Du unter Linux arbeitest, benutze valgrind. Damit findest Du eigentlich jedes Speicherproblem
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.11.2003, 09:56 Uhr
ao

(Operator)


Ist es ein C++ (d.h. kein C)-Programm? Dann werden *vor* dem Ende von main(), also quasi zwischen return-Statement und }, die Destruktoren aller lokalen Objekte von main aufgerufen. *Nach* dem Ende von main werden die globalen Objekte aufgeräumt, d.h. nach } wird tatsächlich noch Code ausgeführt. Falls da ein Fehler drin ist, kann es natürlich auch SegFaults geben.

Wenn du unbedingt mit printf weiterarbeiten willst, kannst du mal Meldungen in die Destruktoren einbauen und sehen, wie weit du kommst. Das Mittel der Wahl für solche Fälle ist aber eigentlich ein Debugger, und wenn du den bisher nicht kanntest, wäre das jetzt ein guter Zeitpunkt, ihn kennenzulernen.

Ich würde das Programm bis zum return-Statement laufenlassen und dann im Step-Into-Modus schrittweise weitergehen. Dann müsstest du nacheinander in alle Destruktoren springen und eigentlich relativ schnell darauf kommen, wo es knallt.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.11.2003, 10:10 Uhr
HRI-Dummy



Das Programm ist ein C-Programm, den Debugger kenne ich zwar, aber ehrlich gesagt komme ich damit noch nicht so klar. In VB war der schoen einfach zu bedienen, aber der von Emacs ist irgendwie so, weiss auch nicht, ich wersteh nicht, wie ich das Ding anwenden muss.
Was ist mit diesem valgrind Tool, ist das bei Linux dabei, oder muss ich mir das erst besorgen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.11.2003, 12:55 Uhr
ao

(Operator)



Zitat:
HRI-Dummy postete
den Debugger kenne ich zwar, aber ehrlich gesagt komme ich damit noch nicht so klar. In VB war der schoen einfach zu bedienen, aber der von Emacs ist irgendwie so, weiss auch nicht, ich wersteh nicht, wie ich das Ding anwenden muss.


Der "Debugger von Emacs", das ist doch gdb, oder? Für den gibts ein wunderbares grafisches Frontend namens ddd. Solltest du mal probieren.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.11.2003, 17:47 Uhr
virtual
Sexiest Bit alive
(Operator)


valgrind ist ein Memory Debugger. Wenn er nicht da ist, mußt Du ihn installieren. Die Sache ist eigentlich ganz einfach:
Einfach valgrind gefolgt vom Namen deines Programms aufrufen:

Code:
valgrind deinprogram parameter_fuer_dein_programm


Dein Programm läuft normal (vielleicht etwas langsamer) und gleichzeitig gibt dir valgrind aus, wo du Probleme mit Speicher hast (doppelt freigegebener Speicher, nicht freigegebener Speicher, zugriff auf uninitialisierte Felder usw). WEnn Du mit Debuginfos übersetzt hast, sgt es Dir sogar, in welcher Zeile im Source das Problem war. Ich kanns nur allerwärmstes Empfehlen, allein dieses Programm ist einen Umstieg auf Linux wert (denn nur da gibt es das!)
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: