Debug: Eine Zeile weiter ...

Für Fragen von Einsteigern und Programmieranfängern...
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Debug: Eine Zeile weiter ...

Beitrag von Aliobaba »

Hallo,

ich suche nach einer Möglichkeit, nach einem Break-Punkt im Programmcode eine Zeile weiter zu gehen: Dabei sollen aber nur die Zeilen angesprungen werden, die ich selber programmiert habe.
Wenn ich F7 oder F8 drücke springt der Cursor auch in Zeilen des "Lazarus-Codes", die ich 1. meist nicht verstehe :oops: und bei denen 2. ja kein Fehler zu erwarten ist. Auch ist für mich dieser interne Programmablauf nicht so wichtig, wenn ich einen eigenen Fehler suche.

Ich würde damit also mein Programm vom Ablauf her gerne so verfolgen können, dass nur der von mir geschriebene Code der Reihe nach abgearbeitet wird.

Geht das? Wie geht das?

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1766
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Debug: Eine Zeile weiter ...

Beitrag von corpsman »

Servus,

Ich arbeite in der Regel stets mit 2 Breakpointen, die ich dann mittels F9 anspringen lasse, in deinem Fall hiese dass, du setzt den nächsten Breakpoint immer auf die nächste von dir geschriebene Zeile. Und tippst anstatt F8 oder F7 einfach F9.

Gruß

Corpsman
--
Just try it

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Debug: Eine Zeile weiter ...

Beitrag von Aliobaba »

Hallo,

Danke für die Antwort, aber wenn sich das eigene Programm "eigenartig" verhält [aktuell: Ein Element erhält den Focus und man weiß nicht, warum eigentlich], dann kann man nicht auf so viele Zeilen einen Breakpunkt setzen, weil man ja auch gar icht weiß, in welches Unterprogramm möglicherweise gesprungen wird.
Da wäre es schon recht gut, wenn nur die "eigenen" Code-Zeilen angesprungen würden und nicht x Verzweigungen in den Tiefen des Lazarus-eigenen Code.

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Debug: Eine Zeile weiter ...

Beitrag von Christian »

Wenn an einer Exception gehalten wird, drück mal Strg+Alt+S...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Debug: Eine Zeile weiter ...

Beitrag von Aliobaba »

Danke, ... bringt leider nichts.
Seltsam, dass nicht mehr Anwender den Wunsch haben, dass nur die "eigenen" Code-Zeilen nach einem gesetzten Break-Punkt angesprungen werden sollen, um das eigene "Werk" zu überprüfen.
Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

martin_frb
Beiträge: 604
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Debug: Eine Zeile weiter ...

Beitrag von martin_frb »

Aliobaba hat geschrieben:Hallo,
Wenn ich F7 oder F8 drücke springt der Cursor auch in Zeilen des "Lazarus-Codes",
F7 "step into" springt in die LCL (lazarus Code)

F8 "step over" sollte immer zu naechten Zeile springen,
Ausnahme:
a) Es ist ein breakpoint in der LCL gesetzt
b) Es gibt eine Exception

Im Falle einer Exception haelt der Code manchmal in der LCL, oder generell im falschem Stack frame, dann kann man das stack window verwenden http://wiki.lazarus.freepascal.org/IDE_ ... Call_Stack und den am weitest oben liegenden, interessanten "frame" waehlen.

Wenn das nicht hilft, oder bei Dir etwas anderes passiert, dann bitte mehr Details.

---------------------------
Um F7 (nur F7, nicht Exceptions) am in die LCL springen zu hindern, kann man auch die LCL und alle packages ohne debug info neu kompilieren....

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

Re: Debug: Eine Zeile weiter ...

Beitrag von wp_xyz »

M.E. springt der Debugger in den LCL-Code nur, wenn Debuginformationen dazu vorhanden sind. Um das abzustellen, gehe zu "Werkzeuge" / "'Lazarus übersetzen' einrichten" und wähle als Profil "Normale IDE" oder "Optimierte IDE". Dann Lazarus neu kompilieren.
Zuletzt geändert von wp_xyz am So 5. Jan 2014, 17:22, insgesamt 1-mal geändert.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Debug: Eine Zeile weiter ...

Beitrag von Christian »

Was heisst "bringt nichts" ? Damit siehst du doch woher du gekommen bist und kannst schaun wo im eigenen code der Fegler liegt...
Seltsam das dir das nichts nutzen soll, den anderen nutzt das scheinbar genug denn sonst würden mehr danach schrein ... ;)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Re: Debug: Eine Zeile weiter ...

Beitrag von Michl »

Nur der Vollständigkeit halber: Mit F4 wird der Code bis zum Cursor ausgeführt (man spart sich damit das Setzen eines Breakpoints an dieser Stelle).

Code: Alles auswählen

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

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Debug: Eine Zeile weiter ...

Beitrag von Aliobaba »

... nein, um Gottes Willen; ich wollte doch Lazarus nicht herabwürdigen :shock:
Natürlich bringt der Debugger auch mir täglich sehr viel.

Aber ich wollte doch nur fragen, ob es eine Möglichkeit gibt, die verhindert, dass die Ablaufverfolgung Sachen anspringt wie:
"ZAbstractRODataset" oder "ZDbcCachedResultSet" oder "ZDbcResultSet" oder "ZAbstractConnection".

Wie diese Dateien durchlaufen werden interessiert mich nicht, wenn ich eigene Fehler suche. Schön wäre es halt, wenn nur "eigener Code" angesprungen würde. Und ich wollte nur fragen, ob man dies irgendwie einstellen kann.

Aliobaba

... und jetzt fällt mir erst auf, dass es sich dabei wohl um "Zeos-Teile" handelt. Woher sollte Lazarus auch wissen, dass ich dies sicherlich nicht debuggen muss - ich jedenfalls sicherlich nicht.
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

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

Re: Debug: Eine Zeile weiter ...

Beitrag von Michl »

Ich für meinen Teil, verstehe Dein Problem eigentlich nicht wirklich. Wenn es mein eigener Code ist, dann setze ich mir an eine, mich interessierende, Stelle einen Breakpoint, lasse mein Programm bis dahin laufen. Wenn ich einen Schritt weiter will, drücke ich, wenn ich in die Procedure/Function hineinspringen will, F7, ansonsten F8. Ist es eine Schleife, so gehe ich mit dem Cursor bis nach der Schleife und drücke F4 oder setze mir den nächsten Breakpoint und drücke F9. Ist doch alles prima so :)

Code: Alles auswählen

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

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1337
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 4.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Debug: Eine Zeile weiter ...

Beitrag von kralle »

Hallo Aliobaba,

hast Du inzwischen eigenliche eine Lösung für das Problem gefunden?
Mich nervt es auch tierisch, das der Debugger mir Fehlerstellen in den "Lazarus-Units" anzeigt und nicht die Stelle in meinem Code die den Fehler auslöst.

Gruß Heiko
==========================================
Wenn ich unter Windows 8.1 Pro in Lazarus 1.6 eine neue Anwendung erstelle, auf dem Formular eine Button und eine Editfeld platziere und dann diesen nachweislich fehlerhaften Code ausführe:

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var i: real;
  Stringlist: TStringList;
begin
 Stringlist.create;
 i:=i/StrToInt(Edit1.Text);
 Stringlist.clear;
end;
 
end.
 
Dann bekomme ich die Fehlermeldung
Projekt project1 hat eine Exception-Klasse >>External: SIGSEGV<< ausgelöst. Bei Adresse 10000BAB
.
Bestätge ich die Meldung mit [OK], lande ich nicht an der verursachenden Stelle im Quellcode

Code: Alles auswählen

Stringlist.create;
, sondern das Assemblerfenster geht an der angegebenen Adresse auf.
Nehme ich die obige Zeile raus und starte das Programm, dann führen eine Null im Editfeld oder einfach ein Klick auf den Button, zu der Stelle im Quellcode die damit Probleme hat.
Warum ist das nicht bei allen Fehlern so? Warum lande ich bei obigen Beispiel nicht bei

Code: Alles auswählen

Stringlist.create;
?
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

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

Re: Debug: Eine Zeile weiter ...

Beitrag von Michl »

Keine Ahnung, ob man ähnlich FPC, die Sourcen der LCL einmal ohne Debuginformationen bauen kann und nur die eigenen Projektdateien mit Debuginformationen kompilieren kann.

Nicht desto trotz kannst du dir mit <Ctrl> + <Alt> + <S> den Aufrufstack anzeigen lassen, darin auf eine dir bekannte Unit gehen (z.B. unit1.pas) und mit <Ctrl> + <V> die Codestelle anzeigen lassen (sollte Stringlist.create anzeigen).

Code: Alles auswählen

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

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1337
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 4.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Debug: Eine Zeile weiter ...

Beitrag von kralle »

Tja, wenn man sich das Bild anschaut, dann ist da keine bekannte Unit ...

und nun?
Gruß Heiko
Dateianhänge
Assembler und Aufrufstack Hardcopy
Assembler und Aufrufstack Hardcopy
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Debug: Eine Zeile weiter ...

Beitrag von Euklid »

Aliobaba hat geschrieben: Schön wäre es halt, wenn nur "eigener Code" angesprungen würde. Und ich wollte nur fragen, ob man dies irgendwie einstellen kann.

Aliobaba

... und jetzt fällt mir erst auf, dass es sich dabei wohl um "Zeos-Teile" handelt. Woher sollte Lazarus auch wissen, dass ich dies sicherlich nicht debuggen muss - ich jedenfalls sicherlich nicht.
... wie Martin schon schrieb: Mit F8 sollte er NICHT in die Funktion hinein springen (Edit: Auch nicht in Zeos-Units). Das ist genau was Du suchst und funktioniert bei richtiger Konfiguration auch problemlos.

Antworten