Discussion:
Debugproblem
(zu alt für eine Antwort)
Matthias Frey
2015-09-17 18:43:01 UTC
Permalink
Hallo zusammen,
ich habe hier ein Problem und bitte nach einigen Stunden um Eure
Mithilfe. Es geht um einen alten Code den ich nun Stück um Stück
umbauen möchte.

In unit 1:
...
type
TThema = record
...
public
Datei : String;
Beschr: String;
Anzahl: String;
...
end;

In unit 2:
...
procedure TBla.HoleThema(Index:Integer; out Thema:TThema);
var ts:TIrgendwas; ...
begin
...
Thema := ThemaFromZeile(ts);
end; // <--1

In unit 3:
procedure TFu.Abc;
var
Thema: TThema; Index:Integer;
...
begin
Index := ListBox.ItemIndex;
...
Themen.HoleThema(Index, Thema);
... // <--2
end;

Bei der Position // <--1 zeigt der Debugger an:
('02345670', 'Alle 8 Ziffern ersetzt nurch 0', ' 0')
Wenn ich nun mit F8 weitergehe und die Methode verlasse,
dann ist bei der Position // <--2 jedoch ('', '', '')

Anders gesagt, der (richtige) Wert des Parameters in der Methode
ist außerhalb ein anderer.

Habe auch schon mal alle dcu's gelöscht, Delphi (XE-2) neu gestartet.
Habe es auch versucht mit "var" statt "out" und als function statt
procedure - half alles nichts. Woran könnte es liegen, was
kann ich noch versuchen oder untersuchen?

Vielleicht noch interessant: nach "end;" komme ich an
_FinalizeRecord vorbei und dabei noch in _FinalizeArray, sowie in
_UStrClr - und das dreimal.
Wenn ich var-Parameter verwende, dann kommen die Werte raus die
auch reingehen. Die Zuweisung "Thema := " scheint nichts zu tun.

Ich könnte zwar nun statt einem Record eine TObject oder ein
TInterfacedObject nehmen, möchte aber nun schon wissen warum
das nicht funktioniert.

Matthias
Jens Köhler
2015-09-21 06:47:54 UTC
Permalink
Post by Matthias Frey
Hallo zusammen,
ich habe hier ein Problem und bitte nach einigen Stunden um Eure
Mithilfe. Es geht um einen alten Code den ich nun Stück um Stück
umbauen möchte.
....
procedure TBla.HoleThema(Index:Integer; out Thema:TThema);
var ts:TIrgendwas; ...
begin
...
Thema := ThemaFromZeile(ts);
end; // <--1
procedure TFu.Abc;
var
Thema: TThema; Index:Integer;
...
begin
Index := ListBox.ItemIndex;
...
Themen.HoleThema(Index, Thema);
... // <--2
end;
Matthias
Hallo,

ist Themen vom Typ TBla?

Gibt es davon nur EINE initialisierte Variable?

Jens
Matthias Frey
2015-09-21 17:25:40 UTC
Permalink
Post by Jens Köhler
Hallo,
Hallo
Post by Jens Köhler
ist Themen vom Typ TBla?
Ja. Sorry dass ich das nicht erwähnt habe.
Post by Jens Köhler
Gibt es davon nur EINE initialisierte Variable?
Ja. Die ist global.
Kann das einen Unterschied machen? Das "Themen" kommt hier
ja nur einmal vor.

(Threads sind weit entfernt von diesem Code.)
Post by Jens Köhler
Jens
Matthias
Jens Köhler
2015-09-22 14:18:10 UTC
Permalink
Post by Matthias Frey
Post by Jens Köhler
Gibt es davon nur EINE initialisierte Variable?
Ja. Die ist global.
Kann das einen Unterschied machen? Das "Themen" kommt hier
ja nur einmal vor.
Matthias
Wenn das Ganze auf 3 Units verteilt ist, hat man schnell versehentlich
noch eine 2. Variable angelegt.
Also z.B. mal die Klassendeklaration umbenennen und sehen wo der
Compiler überall meckert.

Jens
Matthias Frey
2015-09-22 20:29:15 UTC
Permalink
Am 22.09.2015 um 16:18 schrieb Jens Köhler:

Hallo Jens,
Wenn das Ganze auf 3 Units verteilt ist, hat man schnell versehentlich noch
eine 2. Variable angelegt.
Hm, wüsste jetzt nicht wo das ein Problem sein sollte. Ich benutze
ja immer nur eine zur selben Zeit. Es ist ja eine Instanz vom Typ
TBla. Dort drin rufe ich die Methode "HoleThema" auf. Während ich
in dieser Methode bin, ändert der Aufrufer sich doch nicht.
Also z.B. mal die Klassendeklaration umbenennen und sehen wo der Compiler
überall meckert.
Habe ich gemacht, Klasse und Instanzvariable umbenannt.
Leider keine Änderung.

Eine Idee hatte ich noch. Ein Verdacht war ja dass es was mit den
Strings zu tun hat. Daher habe ich den record TThema noch um ein
Feld Dummy: Integer ergänzt. Mit diesem Feld funktioniert die
Rückgabe, nur mit den Strings nicht.
Jens
Matthias
Jens Köhler
2015-09-23 13:23:48 UTC
Permalink
Post by Matthias Frey
Post by Jens Köhler
Wenn das Ganze auf 3 Units verteilt ist, hat man schnell versehentlich
noch eine 2. Variable angelegt.
Hm, wüsste jetzt nicht wo das ein Problem sein sollte.
Aber wenn Du unterschiedliche Variablen hast, dürfen die auch
unterschiedliche Inhalte haben.

Jens
Hans-Peter Diettrich
2015-09-23 01:44:43 UTC
Permalink
Post by Matthias Frey
Hallo zusammen,
ich habe hier ein Problem und bitte nach einigen Stunden um Eure
Mithilfe. Es geht um einen alten Code den ich nun Stück um Stück
umbauen möchte.
...
type
TThema = record
Ich erinnere mich dunkel daran, daß Records (und Objects) möglichst nur
als Pointer zurückgegeben werden sollten. Mit "out" bin ich schon in
alten Delphi-Versionen auf Probleme gestoßen.

Es gab auch schon Probleme mit Strings, die unter gewissen Umständen
nicht richtig kopiert bzw. weitergegeben wurden. Wenn solche Fehler
immer noch auftreten können (entsprechende Beispiele sollten noch
irgendwo im Netz zu finden sein), könnte auch das beim Kopieren der
Records Probleme verursachen.
Post by Matthias Frey
Ich könnte zwar nun statt einem Record eine TObject oder ein
TInterfacedObject nehmen, möchte aber nun schon wissen warum
das nicht funktioniert.
Das wäre aber IMO ein ganz anderer Ansatz. Das Kopieren eines TObject
muß ja explizit programmiert werden (Assign/AssignTo). Da stellt sich
mir die Frage: willst Du Deine Records wirklich kopieren, oder nur einen
Pointer (TObject: Referenz) auf eine existierende Instanz weitergeben?

DoDi
Marc Santhoff
2015-09-23 04:27:48 UTC
Permalink
Post by Hans-Peter Diettrich
Post by Matthias Frey
Hallo zusammen,
ich habe hier ein Problem und bitte nach einigen Stunden um Eure
Mithilfe. Es geht um einen alten Code den ich nun Stück um Stück
umbauen möchte.
...
type
TThema = record
Es gab auch schon Probleme mit Strings, die unter gewissen Umständen
nicht richtig kopiert bzw. weitergegeben wurden. Wenn solche Fehler
immer noch auftreten können (entsprechende Beispiele sollten noch
irgendwo im Netz zu finden sein), könnte auch das beim Kopieren der
Records Probleme verursachen.
Kennst Du die Umstände, unter denen das passiert?

Ich hatte vor ca. 10 Jahren ein recht hartnäckiges Problem, daß vom
Szenario mit dem von Matthias übereinstimmt. Da wurden auch Strings als
Felder von Records nicht kopiert, IIRC gab es aber NIL-Pointer zurück,
keine Leerstrings.

Das war aber mit FPC, irgendwas bei Version 2.x.x. Ich habe mir damals
mit UniqueString() geholfen, daß zwangsweise eine Kopie anlegt und
nicht einfach den Pointer auf den betreffenden String zurückgibt, und es
funktionierte.

HTH irgendwie,
Marc
Hans-Peter Diettrich
2015-09-23 13:15:27 UTC
Permalink
Post by Marc Santhoff
Post by Hans-Peter Diettrich
Post by Matthias Frey
Hallo zusammen,
ich habe hier ein Problem und bitte nach einigen Stunden um Eure
Mithilfe. Es geht um einen alten Code den ich nun Stück um Stück
umbauen möchte.
...
type
TThema = record
Es gab auch schon Probleme mit Strings, die unter gewissen Umständen
nicht richtig kopiert bzw. weitergegeben wurden. Wenn solche Fehler
immer noch auftreten können (entsprechende Beispiele sollten noch
irgendwo im Netz zu finden sein), könnte auch das beim Kopieren der
Records Probleme verursachen.
Kennst Du die Umstände, unter denen das passiert?
Nicht genau, irgendwas beim Kopieren oder Konkatenieren von
String-Parametern in Unterprogrammen. Ggf. nur bei CONST Parametern? Da
konnte es passieren, daß ein String zu früh freigegeben wurde, nicht
erst nach Auswertung eines komplexen Ausdrucks (mit mehreren Operanden).
Seitdem bin ich bei CONST Parametern vorsichtiger geworden.
Post by Marc Santhoff
Ich hatte vor ca. 10 Jahren ein recht hartnäckiges Problem, daß vom
Szenario mit dem von Matthias übereinstimmt. Da wurden auch Strings als
Felder von Records nicht kopiert, IIRC gab es aber NIL-Pointer zurück,
keine Leerstrings.
Leerstrings (AnsiString) *sind* NIL-Pointer per Definition!
Post by Marc Santhoff
Das war aber mit FPC, irgendwas bei Version 2.x.x. Ich habe mir damals
mit UniqueString() geholfen, daß zwangsweise eine Kopie anlegt und
nicht einfach den Pointer auf den betreffenden String zurückgibt, und es
funktionierte.
Da man bei (solchen) Compiler-Fehlern die Logik des Compilers
austricksen muß, hängen die möglichen Workarounds vom jeweiligen Fehler
ab. Mit etwas Glück helfen einfache Änderungen, wie das Weglassen von
CONST, aber es kann auch weit mehr Aufwand notwendig sein.

DoDi
Marc Santhoff
2015-09-23 17:01:15 UTC
Permalink
Post by Hans-Peter Diettrich
Post by Marc Santhoff
Post by Hans-Peter Diettrich
Post by Matthias Frey
Hallo zusammen,
ich habe hier ein Problem und bitte nach einigen Stunden um Eure
Mithilfe. Es geht um einen alten Code den ich nun Stück um Stück
umbauen möchte.
...
type
TThema = record
Es gab auch schon Probleme mit Strings, die unter gewissen Umständen
nicht richtig kopiert bzw. weitergegeben wurden. Wenn solche Fehler
immer noch auftreten können (entsprechende Beispiele sollten noch
irgendwo im Netz zu finden sein), könnte auch das beim Kopieren der
Records Probleme verursachen.
Kennst Du die Umstände, unter denen das passiert?
Nicht genau, irgendwas beim Kopieren oder Konkatenieren von
String-Parametern in Unterprogrammen. Ggf. nur bei CONST Parametern?
Da konnte es passieren, daß ein String zu früh freigegeben wurde,
nicht erst nach Auswertung eines komplexen Ausdrucks (mit mehreren
Operanden). Seitdem bin ich bei CONST Parametern vorsichtiger
geworden.
Den anderen Antworten würde ich einen Versuch geben, var statt out
klingt plausibel. Es wird ja tatsächlich eine VAriable reingereicht,
wenn auch als Kopie und nciht als Referenz.
Post by Hans-Peter Diettrich
Post by Marc Santhoff
Ich hatte vor ca. 10 Jahren ein recht hartnäckiges Problem, daß vom
Szenario mit dem von Matthias übereinstimmt. Da wurden auch Strings
als Felder von Records nicht kopiert, IIRC gab es aber NIL-Pointer
zurück, keine Leerstrings.
Leerstrings (AnsiString) *sind* NIL-Pointer per Definition!
Bist Du sicher? Und gilt das für FPC und Delphi?

Ich kann und will an dem alten COde nicht fummeln, aber ich meine es
gab zu der Zeit bei NIL logischerweise Exceptions, bei explizit auf ''
gesetzten Strings nicht. Muß ich glatt bei Gelegenheit mal testen.
Post by Hans-Peter Diettrich
Post by Marc Santhoff
Das war aber mit FPC, irgendwas bei Version 2.x.x. Ich habe mir
damals mit UniqueString() geholfen, daß zwangsweise eine Kopie
anlegt und nicht einfach den Pointer auf den betreffenden String
zurückgibt, und es funktionierte.
Da man bei (solchen) Compiler-Fehlern die Logik des Compilers
austricksen muß, hängen die möglichen Workarounds vom jeweiligen
Fehler ab. Mit etwas Glück helfen einfache Änderungen, wie das
Weglassen von CONST, aber es kann auch weit mehr Aufwand notwendig
sein.
Damit dürftest Du richtig liegen. Ich meine mich dunkel zu erinnern,
daß ein oder zwei Minor-Versionen des COmpilers später das Problem
verschwunden war, also tatsächlich ein Bug in der Speicherverwaltung
o.ä.

Marc
Hans-Peter Diettrich
2015-09-24 09:27:04 UTC
Permalink
Post by Marc Santhoff
Post by Hans-Peter Diettrich
Leerstrings (AnsiString) *sind* NIL-Pointer per Definition!
Bist Du sicher? Und gilt das für FPC und Delphi?
Ja, ja. Das gilt für alle "managed" Datentypen (mit RefCount).

DoDi
Marc Santhoff
2015-09-25 05:40:08 UTC
Permalink
Post by Hans-Peter Diettrich
Post by Hans-Peter Diettrich
Leerstrings (AnsiString) *sind* NIL-Pointer per Definition!
Bist Du sicher? Und gilt das für FPC und Delphi?
Ja, ja. Das gilt für alle "managed" Datentypen (mit RefCount).
Du hast ǵanz klar recht:

program strnil;
var
s: ansistring;
begin
if (pointer(s)=NIL) then writeln('Uninitialized string is NIL.');
s := '';
if (pointer(s)=NIL) then writeln('Empty string is NIL.');
s := 'xyz';
writeln(s);
end.
Post by Hans-Peter Diettrich
fpc strnil.pp
Free Pascal Compiler version 2.6.4 [2014/02/27] for x86_64
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: FreeBSD for x86-64
Compiling strnil.pp
strnil.pp(5,15) Warning: Variable "s" does not seem to be initialized
Linking strnil
10 lines compiled, 0.3 sec
1 warning(s) issued
Post by Hans-Peter Diettrich
./strnil
Uninitialized string is NIL.
Empty string is NIL
xyz


Marc
Jens Köhler
2015-09-23 13:43:49 UTC
Permalink
Post by Matthias Frey
procedure TFu.Abc;
var
Thema: TThema; Index:Integer;
begin
Themen.HoleThema(Index, Thema);
... // <--2
end;
Anders gesagt, der (richtige) Wert des Parameters in der Methode
ist außerhalb ein anderer.
Matthias
Hallo,

ich habe mal versucht, das Ganze nachzuvollziehen soweit das mit dem
Code möglich ist.

Benutzt Du das Thema in abc noch?
Thema ist eine lokale Variable, die am Ende der Funktion weggeworfen
wird. In meinem Versuch ändern sich die Werte dann auch.

Jens
Matthias Frey
2015-09-26 16:18:36 UTC
Permalink
Post by Jens Köhler
Hallo,
Hallo
Post by Jens Köhler
ich habe mal versucht, das Ganze nachzuvollziehen soweit das mit dem Code
möglich ist.
Benutzt Du das Thema in abc noch?
Ja natürlich. Die Werte will ich ja haben.
Post by Jens Köhler
Thema ist eine lokale Variable, die am Ende der Funktion weggeworfen wird.
In meinem Versuch ändern sich die Werte dann auch.
Aber doch hoffentlich erst am ende der Funktion.
Post by Jens Köhler
Jens
Matthias
Jens Köhler
2015-09-27 08:17:43 UTC
Permalink
Post by Matthias Frey
Post by Jens Köhler
Thema ist eine lokale Variable, die am Ende der Funktion weggeworfen
wird. In meinem Versuch ändern sich die Werte dann auch.
Aber doch hoffentlich erst am ende der Funktion.
Ja. Wenn man vorher noch etwas einfügt, wo der Debugger stehen bleiben
kann, sind die String korrekt.

Jens
Matthias Frey
2015-09-30 13:37:08 UTC
Permalink
Post by Jens Köhler
Post by Matthias Frey
Post by Jens Köhler
Thema ist eine lokale Variable, die am Ende der Funktion weggeworfen
wird. In meinem Versuch ändern sich die Werte dann auch.
Aber doch hoffentlich erst am ende der Funktion.
Ja. Wenn man vorher noch etwas einfügt, wo der Debugger stehen bleiben
kann, sind die String korrekt.
Bei mir eben nicht. Sie kommen nicht richtig aus der inneren Methode
raus. Nach dem Aufruf der inneren Methode bis zur letzten Verwendung
in der außeren Methode sind die Werte konstant.
Post by Jens Köhler
Jens
Matthias
Jens Köhler
2015-09-30 17:12:29 UTC
Permalink
Post by Matthias Frey
Bei mir eben nicht. Sie kommen nicht richtig aus der inneren Methode
raus.
Matthias
Da es in dem, was ich aus Deinen Fragmenten gemacht habe, funktioniert,
kann ich leider nicht weiter helfen.

Jens
Georg Hübner
2015-09-23 16:43:57 UTC
Permalink
Hallo,
Post by Matthias Frey
...
procedure TBla.HoleThema(Index:Integer; out Thema:TThema);
var ts:TIrgendwas; ...
begin
...
versuch es einmal mit var statt mit out:
procedure TBla.HoleThema(Index:Integer; var Thema:TThema);

Mfg


Georg Hübner
Matthias Frey
2015-09-26 16:20:03 UTC
Permalink
Post by Jens Köhler
Hallo,
Hallo!
Post by Jens Köhler
Post by Matthias Frey
...
procedure TBla.HoleThema(Index:Integer; out Thema:TThema);
var ts:TIrgendwas; ...
begin
...
procedure TBla.HoleThema(Index:Integer; var Thema:TThema);
...
Habe es auch versucht mit "var" statt "out" und als function statt
procedure - half alles nichts. ...
Mfg
Georg Hübner
Grüsse
Matthias
Marc Santhoff
2015-09-26 17:39:40 UTC
Permalink
Post by Matthias Frey
procedure TBla.HoleThema(Index:Integer; out Thema:TThema);
var ts:TIrgendwas; ...
begin
...
Thema := ThemaFromZeile(ts);
end; // <--1
Bist DU sicher, daß die Daten außerhalb dieses Kontextes noch
existieren?

Vielleicht werden die vom darunter liegenden Code freigegeben, deswegen
und weil's ein Bug sein kann auch mein Vorschlag, Kopien von den Strings
anzulegen.

Marc
Matthias Frey
2015-09-26 19:35:51 UTC
Permalink
Post by Marc Santhoff
Post by Matthias Frey
procedure TBla.HoleThema(Index:Integer; out Thema:TThema);
var ts:TIrgendwas; ...
begin
...
Thema := ThemaFromZeile(ts);
end; // <--1
Bist DU sicher, daß die Daten außerhalb dieses Kontextes noch
existieren?
Welche Daten genau meinst du?
Ich bin mir recht sicher, dass die Strings in Thema nicht mehr
existieren. Aber ich bin mir andererseits auch ziemlich sicher, dass
sie existieren SOLLTEN.
Post by Marc Santhoff
Vielleicht werden die vom darunter liegenden Code freigegeben, deswegen
und weil's ein Bug sein kann auch mein Vorschlag, Kopien von den Strings
anzulegen.
Für meinen produktiven Code mache ich jetzt statt einem record
ein TThema = class(TInterfacedObject, IThema)

Eine Kopie explizit zu machen nur weil es funktioniert halte ich
für Murks. Ich müsste und will verstehen, warum es so ist wie es ist.
Post by Marc Santhoff
Marc
Matthias
Marc Santhoff
2015-09-27 05:18:46 UTC
Permalink
Post by Matthias Frey
Post by Marc Santhoff
Post by Matthias Frey
procedure TBla.HoleThema(Index:Integer; out Thema:TThema);
var ts:TIrgendwas; ...
begin
...
Thema := ThemaFromZeile(ts);
end; // <--1
Bist DU sicher, daß die Daten außerhalb dieses Kontextes noch
existieren?
Welche Daten genau meinst du?
Die Strings in "Thema".
Post by Matthias Frey
Ich bin mir recht sicher, dass die Strings in Thema nicht mehr
existieren. Aber ich bin mir andererseits auch ziemlich sicher, dass
sie existieren SOLLTEN.
In TBla.HoleThema() existieren sie. Zumindest zeitweise.
Post by Matthias Frey
Post by Marc Santhoff
Vielleicht werden die vom darunter liegenden Code freigegeben,
deswegen und weil's ein Bug sein kann auch mein Vorschlag, Kopien
von den Strings anzulegen.
Für meinen produktiven Code mache ich jetzt statt einem record
ein TThema = class(TInterfacedObject, IThema)
Eine Kopie explizit zu machen nur weil es funktioniert halte ich
für Murks. Ich müsste und will verstehen, warum es so ist wie es ist.
Wenn Du schreibst, Du hättest alles versucht, schließt das einen
expliziten Zeiger ein? Parameter mit out oder var werden natürlich als
Pointer behandelt, aber wer weiß?

PThema = ^TThema;
procedure TBla.HoleThema(Index:Integer; out Thema: PThema);

Außerdem, und viel wichtiger, prüfe doch mal den Code davor, wie geht
ThemaFromZeile() mit den Strings um? Werden die dort freigegeben, ggf.
asynchron?

Oder liegt das Problem tatsächlich zwischen den zwei Haltepunkten, bei
denen erst die Strings vorhanden sind und dann nicht mehr?

Marc
Matthias Frey
2015-09-30 16:38:11 UTC
Permalink
Post by Marc Santhoff
Post by Matthias Frey
Post by Marc Santhoff
Post by Matthias Frey
procedure TBla.HoleThema(Index:Integer; out Thema:TThema);
var ts:TIrgendwas; ...
begin
...
Thema := ThemaFromZeile(ts);
end; // <--1
Bist DU sicher, daß die Daten außerhalb dieses Kontextes noch
existieren?
Welche Daten genau meinst du?
Die Strings in "Thema".
Post by Matthias Frey
Ich bin mir recht sicher, dass die Strings in Thema nicht mehr
existieren. Aber ich bin mir andererseits auch ziemlich sicher, dass
sie existieren SOLLTEN.
In TBla.HoleThema() existieren sie. Zumindest zeitweise.
Ja.

...
Post by Marc Santhoff
Post by Matthias Frey
Eine Kopie explizit zu machen nur weil es funktioniert halte ich
für Murks. Ich müsste und will verstehen, warum es so ist wie es ist.
Wenn Du schreibst, Du hättest alles versucht, schließt das einen
expliziten Zeiger ein? Parameter mit out oder var werden natürlich als
Pointer behandelt, aber wer weiß?
PThema = ^TThema;
procedure TBla.HoleThema(Index:Integer; out Thema: PThema);
Na ja, bei der Konstruktion bin ich mir sicher das das nicht
funktionieren kann. Der Zeiger zeigt auf etwas was nur lokal
in der Methode existiert. Es könnte funktionieren wenn ich das Thema
außerhalb erzeuge und dann den Pointer in die Methode reinreiche
(mit const oder var)
Post by Marc Santhoff
Außerdem, und viel wichtiger, prüfe doch mal den Code davor, wie geht
ThemaFromZeile() mit den Strings um? Werden die dort freigegeben, ggf.
asynchron?
In ThemaFromZeile() wird das Thema als Result befüllt also z.B.
Result.Datei := '...';
Andererseits verstehe ich auch nicht, warum dann an "// <--1"
Das Thema laut Debugger noch richtig ist.
Post by Marc Santhoff
Oder liegt das Problem tatsächlich zwischen den zwei Haltepunkten, bei
denen erst die Strings vorhanden sind und dann nicht mehr?
Nach (meinem) Debugger (und meiner Beurteilung) ja
Post by Marc Santhoff
Marc
Matthias
Hans-Peter Diettrich
2015-09-30 17:22:32 UTC
Permalink
Post by Matthias Frey
Post by Marc Santhoff
Oder liegt das Problem tatsächlich zwischen den zwei Haltepunkten, bei
denen erst die Strings vorhanden sind und dann nicht mehr?
Nach (meinem) Debugger (und meiner Beurteilung) ja
Hast Du schon mal versucht, die Strings testhalber in die Konsole
auszugeben? Das sollte zuverlässiger funktionieren als der Debugger.

DoDi

Loading...