Error und Sprung in die Zeile

Für Fragen rund um die Ide und zum Debugger
Antworten
Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Error und Sprung in die Zeile

Beitrag von Epcop »

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

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Error und Sprung in die Zeile

Beitrag von theo »

Für's Erste hilft vielleicht: Ansicht -> Debuggerfenster -> Aufrufstack.

Mathias
Beiträge: 6160
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

Beitrag von Mathias »

Wenn ich dann auf "anhalten" klicke, springt der zu der Zeile, bei dem der Fehler auftritt.

Zeige doch mal diese Zeile.

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;


Noch ein Tip, die Befehlszeile zerlegen, dann sieht du sofort, bei welchem Parameter es ein Überlauf gibt.

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

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Error und Sprung in die Zeile

Beitrag von Epcop »

Hier bleibt er stehen, siehe kommentar.



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.

Mathias
Beiträge: 6160
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

Beitrag von Mathias »

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.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Error und Sprung in die Zeile

Beitrag von Michl »

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.
Mit welcher Debuginfo hast du dein Projekt gebaut? Unter verschiedenen GDB-Versionen funktionieren einige besser, andere nicht. Aktuell nutze ich meistens Dwarf2 (-gw2).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Error und Sprung in die Zeile

Beitrag von wp_xyz »

[quote="Epcop"]

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;

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...

Antworten