Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 01:18

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Okt 05, 2009 20:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hallo allerseits,

Ich habe mal wieder ein sehr unschönes Problem. Und zwar stirbt Thorium in Zeile elf in unten stehendem Code.
Code:
  1. procedure TThoriumInstructions.SetCapacity(NewCapacity: Integer);
  2. // Sets the new capacity for the instruction list. If NewCapacity is smaller
  3. // than the current count, this method does nothing.
  4. var
  5.   Buffer: Pointer;
  6. begin
  7.   if (NewCapacity < FCount) then
  8.     Exit;
  9.   GetMem(Buffer, NewCapacity * SizeOf(TThoriumInstruction));
  10.   Move(FInstructions^, Buffer^, FCapacity * SizeOf(TThoriumInstruction));
  11.   FreeMem(FInstructions);
  12.   FInstructions := PThoriumInstruction(Buffer);
  13.   //ReAllocMem(FInstructions, NewCapacity * SizeOf(TThoriumInstruction));
  14.   FCapacity := NewCapacity;
  15. end;

Klar, damit kann nun keiner was anfangen. Darum geht es auch nicht wirklich. Das Hauptproblem ist nicht, dass er dort abstürzt, sondern, dass es keine Fehlermeldung oder ähnliches gibt, die Details darüber gibt, was eigentlich passiert. Der Prozess beendet sich einfach, wird aber nicht vom Betriebssystem beendet, sondern ordnungsgemäß abgeschlossen. Nicht aber behandelt werden irgendwelche Finallys, die noch in der Aufrufshierarchie weiter oben stehen.
Der Debugger sagt dazu auch nichts. Nach dieser Zeile heißt es einfach "Execution finished".

Jetzt frage ich mich, was kann der Grund für soetwas sein? Hat irgendjemand schon Symptome dieser Art beobachtet? Habt ihr *irgendwelche* noch so vagen Vermutungen, wonach ich ausschau halten soll?

Es wird definitiv *nicht* zu viel Speicher alloziiert. Bei dem fraglichen Aufruf der Methode ist der Parameter = 64, sodass nur 64*32 Bytes reserviert werden sollen.

greetings *verwirrt bin*

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 05, 2009 21:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Läuft vielleicht noch ein anderer Thread parallel, in dem das Programm beendet wird?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 05, 2009 21:32 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hast du den Optimizer drausen? Sonst zeigt der Debgger vielleicht quark an.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 06, 2009 07:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also das sich eine Anwendung urplötzlich beendet kenne ich. Allerdings lag es daran an einer C++ DLL die im Falle eines Fehler ein C++ Close (Halt in pascal) aufgerufen hat. Das sorgt dafür, dass die Anwendung beendet wird. Und zwar kommentarlos und ohne, dass man etwas dagegen tun kann. Allerdings denke ich nicht, dass das bei dir der Fall sein könnte.

Wenn ich eines bei Pointern gelernt habe, dann das man sich nie sicher sein kann an welcher Stelle es tatsächlich das Problem gibt. Es kann auch gut sein, dass dein Pointer irgendwie im Eimer ist und der Speichermanager beim Freigeben merkt, dass er es ist und deswegen aussteigt. In Delphi kommt in solchen Fällen klassischerweise eine Invalid Pointer Operation. Keine Ahnung wie FreePascal da reagiert. Eventuell solltest du mal schauen wie sich deine Pointer verhalten.

Was sagt denn dein ExitCode? Wenn eine Anwendung beendet wird liefern die normalerweise einen Exitcode zurück.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 06, 2009 11:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Philip: Nein, leider nicht. Also zumindest keinen, den ich gestartet hätte.

Flash: Ist ja leider nicht nur der Debugger, sondern auch meine WriteLns, die ziehmlich genau diese Zeile aus Ausstiegspunkt bezeugen. Optimierungen ausgemacht - ändert leider nichts.

Lossy eX: ExitCode ist 1. Gibt ja kaum etwas aussageloseres ...
Ja, ein Halt vermute ich auch. Aber leider wüsste ich nicht, wo das auftreten sollte. Obwohl ... Moment ... in FreeMem reintracen geht nicht und als ich gerade mal in den Sourcecode dazu reingscahut habe, ist mir eingefallen, dass ich ja die Heaptrc.pas benutze. Und sieheda, im log steht tatsächlich was interessantes.
Code:
  1. /home/horazont/Projects/fpc/thorium/lib/x86_64-linux/scripttest
  2. Marked memory at $00007F3D5041FFA0 invalid
  3. Wrong signature $64BF2C22 instead of 03879AB9

Und ohne Heaptrc.pas (welches ja einen separaten Speichermanager implementiert), läuft das ganze auch durch - bis es dann versucht, den Speicherblock weiter zu benutezn. Da knallts dann.
Ich weiss allerdings nicht so recht, was mir das sagen soll. Der Pointer an sich ist eigentlich in Ordnung, das Auslesen der Größe des Speicherblocks funktioniert auch so weit ... Werde mal schauen, was heaptrc mit dieser Meldung meint. Aber danke für die Hinweise, die haben den nötigen Gedankengang induziert, um auf Heaptrc.pas zu kommen.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 08, 2009 11:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Zur Lösung hat schließlich valgrind geführt, welches ich bei dieser Gelegenheit gleich allen Linux-Usern empfehlen will. Valgrind ist ein interessantes Debugging-Tool, welches mit dem richtigen Switch auch bei FPC-Programmen sehr hilfreichen Output produziert. Zum Beispiel:
Code:
  1. ==8687== Invalid write of size 8
  2. ==8687==    at 0x415255: SYSTEM_MOVE$formal$formal$INT64 (in /home/horazont/Projects/fpc/thorium/lib/x86_64-linux/scripttest)
  3. ==8687==    by 0x487A31: THORIUM_COMPILER_TTHORIUMCUSTOMCOMPILER_$__GENCODE$TTHORIUMINSTRUCTION$$LONGINT (thorium_compiler.pas:1396);
  4. ...


Der Fehler war letzendlich, dass ich beim Einfügen einer neuen Instruktion (irgendwo in die mitte) immer ein Element zu viel nach hinten verschoben habe. Das ging so lange gut, bis das mal genau in dem Moment passierte, wo der reservierte Speicher exakt gefüllt wurde (FCount = FCapacity). Dann schrieb er logischerweise über den Rand, zerstörte damit die Signatur, die Heaptrc ans ende schreibt, was heaptrc dann beim realloc alles andere als gefallen hat.

nochmal danke für die hinweise :)

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]