Error und Sprung in die Zeile
Error und Sprung in die Zeile
Hallo,
wenn ich ein Programm aus Lazarus ausführe, bekomme ich eine Fehlermeldung (tstringlist error out of bounds..). Wenn ich dann auf "anhalten" klicke, springt der zu der Zeile, bei dem der Fehler auftritt.
Diese Zeile ist aber eine Funktion von mir, die X weitere Funktionen und mehrere StringList enthält. Wie kann man den Lazarus dazu bewegen, auch in die Funktion reinzugehen, oder dazu veranlassen, mir anzuzeigen, welche StringList den Fehler auslöst? Weil ist etwas mühselig sämtliche Unterfunktionen und StringLists einzeln durchzusehen,...
LG
Epcop
wenn ich ein Programm aus Lazarus ausführe, bekomme ich eine Fehlermeldung (tstringlist error out of bounds..). Wenn ich dann auf "anhalten" klicke, springt der zu der Zeile, bei dem der Fehler auftritt.
Diese Zeile ist aber eine Funktion von mir, die X weitere Funktionen und mehrere StringList enthält. Wie kann man den Lazarus dazu bewegen, auch in die Funktion reinzugehen, oder dazu veranlassen, mir anzuzeigen, welche StringList den Fehler auslöst? Weil ist etwas mühselig sämtliche Unterfunktionen und StringLists einzeln durchzusehen,...
LG
Epcop
Re: Error und Sprung in die Zeile
Für's Erste hilft vielleicht: Ansicht -> Debuggerfenster -> Aufrufstack.
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Error und Sprung in die Zeile
Zeige doch mal diese Zeile.Wenn ich dann auf "anhalten" klicke, springt der zu der Zeile, bei dem der Fehler auftritt.
Hast du zufällig etwas in dieser Art gemacht ?
Ein -1 bei sl.Count vergessen ?
Code: Alles auswählen
var
sl: TStringList;
i: integer;
begin
sl := TStringList.Create;
sl.add('abc');
sl.add('abc');
for i := 0 to sl.Count do begin
WriteLn(sl[i]); // Hier knallts
end;
sl.Free;
end;
Code: Alles auswählen
WriteLn(
sl[0],
sl[3], // Hier wird gehalten.
sl[0] );
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: Error und Sprung in die Zeile
Hier bleibt er stehen, siehe kommentar.
datei_lesen2() enthält ca 200 Zeilen mit weiteren Funktionen. Wobei ich mit 3 StringLists arbeite in dieser Funktion; In den anderen Unterfunktionen arbeite ich teils auch mit StringList. Schön fände ich, wenn er mir da dort genauer sagt, welche Zeile oder wenigstens genauer welcher Abschnitt dort betroffen ist. Oder wenigstens, ob nicht einer der Unterfunktionen betroffen ist.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.ZQuery2.Close; Form1.ZQuery2.SQL.Clear;
Form1.ZQuery2.SQL.Text := 'select count(id) as anz from pa where dateiname = :da_na;';
Form1.ZQuery2.ParamByName('da_na').AsString := ExtractFileName(Edit1.text);
Form1.ZQuery2.Open;
if ( Form1.ZQuery2.FieldByName('anz').AsInteger > 0) then begin
if MessageDlg('Es wurde bereits eine Datei mit gleichen Namen eingelesen. Soll diese Datei trotzdem nochmal eingelesen werden?', mtConfirmation, [mbyes, mbno], 0) = mrNo then begin
ShowMessage('Es wurde keine Datei eingelesen. Fertig.');
exit;
end;
end;
//ShowMessage('Dies kann einen Moment dauern,....');
datei_lesen2(Edit1.text); // HIER MELDET ER DEN FEHLER StringList Error out of bounds...
//ShowMessage('Fertig!');
end;
datei_lesen2() enthält ca 200 Zeilen mit weiteren Funktionen. Wobei ich mit 3 StringLists arbeite in dieser Funktion; In den anderen Unterfunktionen arbeite ich teils auch mit StringList. Schön fände ich, wenn er mir da dort genauer sagt, welche Zeile oder wenigstens genauer welcher Abschnitt dort betroffen ist. Oder wenigstens, ob nicht einer der Unterfunktionen betroffen ist.
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Error und Sprung in die Zeile
Dies ist irgendwie merkwürdig, eigentlich müsste er irgendwo in der Procedure datei_lesen2(... stecken bleiben.
Edit1.Text ist normalerweise keine StringList, sondern eine Ableitung von einem String.
Kannst du mal die procedure datei_lesen2( zeigen ?
Oder wenigsten den Anfang davon.
Edit1.Text ist normalerweise keine StringList, sondern eine Ableitung von einem String.
Kannst du mal die procedure datei_lesen2( zeigen ?
Oder wenigsten den Anfang davon.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: Error und Sprung in die Zeile
Mit welcher Debuginfo hast du dein Projekt gebaut? Unter verschiedenen GDB-Versionen funktionieren einige besser, andere nicht. Aktuell nutze ich meistens Dwarf2 (-gw2).Epcop hat geschrieben:Schön fände ich, wenn er mir da dort genauer sagt, welche Zeile oder wenigstens genauer welcher Abschnitt dort betroffen ist.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Error und Sprung in die Zeile
[quote="Epcop"]
Der allgemeine Weg, einen solchen Fehler zu finden, ist auf der Routine, die den Fehler ausgelöst hat, einen Breakpoint zu setzen, und dann mit F7 in diese Routine hineinzusteppen. Dort kannst du den Debugger mit der Taste F8 den Code Zeile für Zeile ausführenlassen, bzw, wieder mit F7 in die aktuelle Routine eintauchen. Außerdem kannst du die Maus über aktuelle Variablen bewegen und an dem Popupfenster mit dem aktuellen Wert prüfen, ob hier alles in Ordnung ist.
Falls der Debugger trotz F7 nicht in eine Routine verzweigt, ist dort möglicherweise keine Debuginformation vorhanden. In diesem Fall gehe ich bei den Projekt-Optionen zu "Hinzufügungen und Beeinflussungen" und füge die "Benutzerdefinierte Option" -gw2 hinzu (Zeile "gespeichert in der Projektsitzung") - damit werden alle Units des Projekts, auch die, die zu Lazarus gehören (aber nicht die, die zu FCL und RTL gehören), mit Dwarf2-Debuginformation neu übersetzt - dauert ein bisschen...
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
...
datei_lesen2(Edit1.text); // HIER MELDET ER DEN FEHLER StringList Error out of bounds...
...
end;
Falls der Debugger trotz F7 nicht in eine Routine verzweigt, ist dort möglicherweise keine Debuginformation vorhanden. In diesem Fall gehe ich bei den Projekt-Optionen zu "Hinzufügungen und Beeinflussungen" und füge die "Benutzerdefinierte Option" -gw2 hinzu (Zeile "gespeichert in der Projektsitzung") - damit werden alle Units des Projekts, auch die, die zu Lazarus gehören (aber nicht die, die zu FCL und RTL gehören), mit Dwarf2-Debuginformation neu übersetzt - dauert ein bisschen...