Error und Sprung in die Zeile

Für Fragen rund um die Ide und zum Debugger

Error und Sprung in die Zeile

Beitragvon Epcop » 8. Mai 2018, 13:52 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
Epcop
 
Beiträge: 81
Registriert: 29. Mai 2012, 08:36

Beitragvon theo » 8. Mai 2018, 14:23 Re: Error und Sprung in die Zeile

Für's Erste hilft vielleicht: Ansicht -> Debuggerfenster -> Aufrufstack.
theo
 
Beiträge: 8070
Registriert: 11. Sep 2006, 18:01

Beitragvon Mathias » 8. Mai 2018, 17:12 Re: Error und Sprung in die Zeile

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Epcop » 8. Mai 2018, 17:27 Re: Error und Sprung in die Zeile

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.
Epcop
 
Beiträge: 81
Registriert: 29. Mai 2012, 08:36

Beitragvon Mathias » 8. Mai 2018, 17:37 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.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Michl » 8. Mai 2018, 19:18 Re: Error und Sprung in die Zeile

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; 
Michl
 
Beiträge: 2262
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon wp_xyz » 9. Mai 2018, 10:02 Re: Error und Sprung in die Zeile

[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...
wp_xyz
 
Beiträge: 2697
Registriert: 8. Apr 2011, 08:01

• Themenende •

Zurück zu Benutzung der IDE



Wer ist online?

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

porpoises-institution
accuracy-worried