Tipp: Herausfinden wo im Quelltext ein Fehler passiert ist.

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Tipp: Herausfinden wo im Quelltext ein Fehler passiert ist.

Beitrag von Soner »

Einige kennen das vielleicht, ich habe es neulich entdeckt, es ist sehr nützlich. Man kann in sein Programm anzeigen, wo ein Fehler passiert. Bei komplizierten Komponenten wie Datenbankkomponenten zeigt der Debugger meistens Komponentenquelltext an, nicht den eigenen Quelltext wo der Fehler passiert ist.
Ich habe es hier entdeckt:
http://wiki.freepascal.org/Logging_exceptions

In diesem Fall müßt ihr Beispiel ohne Debugger starten:(wegen Division durch Null)

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Spin;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    BtnMachDivDurchNull: TButton;
    SpinEdit1: TSpinEdit;
    procedure BtnMachDivDurchNullClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
    procedure CustomExceptionHandler(Sender: TObject; E: Exception);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException := @CustomExceptionHandler;
end;
 
procedure TForm1.BtnMachDivDurchNullClick(Sender: TObject);
var i: integer;
begin
  i:=10 div SpinEdit1.Value;
end;
 
procedure TForm1.CustomExceptionHandler(Sender: TObject; E: Exception);
var
  I: Integer;
  Frames: PPointer;
  Report: string;
begin
  //aus http://wiki.freepascal.org/Logging_exceptions
  if E <> nil then begin
    Report := 'Fehlerklasse: ' + E.ClassName + LineEnding +
             'Fehlernachricht: '+ LineEnding + E.Message + LineEnding;
  end;
 
  Report := 'Programmfehler! ' + LineEnding +
            Report + LineEnding + LineEnding +
            'Stacktrace:' + LineEnding +
            BackTraceStrFunc(ExceptAddr);
  Frames := ExceptFrames;
  for I := 0 to ExceptFrameCount - 1 do
    Report := Report + LineEnding + BackTraceStrFunc(Frames[I]);
  ShowMessage(Report);
  //Halt; // End of program execution
end;
 
end.
 


Das sieht denn etwa so aus:
Dateianhänge
Bildschirmfoto
Bildschirmfoto

martin_frb
Beiträge: 572
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: Tipp: Herausfinden wo im Quelltext ein Fehler passiert i

Beitrag von martin_frb »

Wenn der Debugger Komponenten-Quelltext anzeigt, einfach das "Stack" Window (aus dem Menu: View > Debug Windows" anzeigen.
Dort findet man dann auch die eigene Unit.

Antworten