Tipp: Herausfinden wo im Quelltext ein Fehler passiert ist.

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.

Tipp: Herausfinden wo im Quelltext ein Fehler passiert ist.

Beitragvon Soner » 17. Jun 2017, 11:40 Tipp: Herausfinden wo im Quelltext ein Fehler passiert ist.

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:
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Soner
 
Beiträge: 371
Registriert: 26. Sep 2012, 23:07
Wohnort: Hamburg
OS, Lazarus, FPC: Win7Pro-32Bit, Immer letzte Lazarus Release mit SVN-Fixes | 
CPU-Target: 32Bit
Nach oben

Beitragvon martin_frb » 17. Jun 2017, 13:23 Re: Tipp: Herausfinden wo im Quelltext ein Fehler passiert i

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.
martin_frb
 
Beiträge: 392
Registriert: 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other | 
CPU-Target: mostly 32 bit
Nach oben

• Themenende •

Zurück zu Programmierung



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried