external SIGSEGV

Für Installationen unter Windows
Antworten
Beetle
Beiträge: 7
Registriert: Mi 1. Jun 2011, 19:02

external SIGSEGV

Beitrag von Beetle »

Hallo FreePascal Gemeide,
ich weiss ich habe es schon gelesen das dieser Fehler nur von Greenhorns ausgelöst wird. Ich habe auch gelesen das es vermutlich nur an den Einstellungen von Larzarus liegt. Allerdings habe ich nicht gefunden wo entsprechende Einstellungen vorzunehmen sind.

Mein System ist ein Toshiba Labtop mit Windows 7 und Ubuntu neueste Version mit AMD Chipsatz

Der Kompiler und Linker arbeiten durch, allerdings beim Start des Testprogrammes bekomme ich halt diesen bedauerlichen Fehler auf dem Windows System. Mit Ubuntu habe ich es nicht getestet. Quellcode:

Code: Alles auswählen

unit koscoLogin;
 
{$mode objfpc}{$H+}
 
interface
 
uses
KOSCOGlobal, { In der GLOBAL werden alle allgemeingültigen Parameter gespeichert }
 
Classes, SysUtils, mysql50conn, FileUtil, Forms, Controls, Graphics, Dialogs,
  StdCtrls;
 
type
 
  { TfrmConnectDB }
 
  TfrmConnectDB = class(TForm)
    Benutzername: TLabel;
    btnConnect: TButton;
    btnAbbruch: TButton;
    Datenbank: TLabel;
    lblKennwort: TLabel;
    MySQL50Connection1: TMySQL50Connection;
    txtDatabase: TEdit;
    txtPassword: TEdit;
    txtUsername: TEdit;
    txtHost: TEdit;
    Label1: TLabel;
    MySQLConnect: TMySQL50Connection;
    procedure btnAbbruchClick(Sender: TObject);
    procedure btnConnectClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure lblKennwortClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  frmConnectDB: TfrmConnectDB;
 
implementation
 
{$R *.lfm}
 
{ TfrmConnectDB }
 
{ TfrmConnectDB }
 
procedure TfrmConnectDB.btnAbbruchClick(Sender: TObject);
begin
  frmConnectDB.Close;
end;
 
procedure TfrmConnectDB.btnConnectClick(Sender: TObject);
begin
 
  { if MySQLConnect.Connected then MySqlConnect.Close; }
 
  MessageDlg('Verbindung hergestellt: ' + txtHost.Text,mtInformation,[mbOk,mbCancel],0);
 
{Hier ist dann der Ausstieg mit Exceptionklasse: external SIGSEGV}
 
  MySQLConnect.HostName := 'localhost';
  MySqlConnect.DatabaseName:= txtDatabase.Text;
  MySqlConnect.UserName:= txtUsername.Text;
  MySqlConnect.Password:= txtPassword.Text;
 
  MySqlConnect.Open;
 
  if MySqlConnect.Connected then
  begin
     MessageDlg('Verbindung hergestellt',mtInformation,[mbOk,mbCancel],0);
  end;
end;
 
procedure TfrmConnectDB.FormCreate(Sender: TObject);
begin
  txtDatabase.Text:=KOSCODatabase;
  txtDatabase.Enabled:=false;
  txtDatabase.Color:=clRed;
end;
 
procedure TfrmConnectDB.lblKennwortClick(Sender: TObject);
begin
 
end;
 
 
 
end.


Ich habe den Quelltext aus dem MySql Lazarus Wiki genommen. Dabei bin ich so froh das ich wieder einen Pascal Compiler gefunden habe. Könnte mir hier mal auf die Sprünge helfen?
Ich wäre auf jeden Fall sehr dankbar.

Grüße
Udo
Zuletzt geändert von Lori am Mi 1. Jun 2011, 19:55, insgesamt 1-mal geändert.
Grund: Highlighter

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: external SIGSEGV

Beitrag von MAC »

Ahh.
Der Fehler trifft auf wenn du auf irgendwas zugreifst , was du nicht darft.
Z.B: Bei arrays auf eine ungültige stelle z.b lenght ist 3 und dann auf Array[-1] oder Array[3] zugreifst --> external SIGSEGV
z.B: Ein Objekt hast , welches nicht Created wurde - du also versuchst den Speicherbereich nil zu ändern...

Benutze mal den Debugger/ setze Breakpoint, indem du am linken Rand von Quelltexteditor auf die ZeilenAngabe klickst...
Das programm wird dann angehalten bis du wieder den grünen Pfeil zum starten (in dem fall weitermachen) klickst.
Am besten setzt du in jeder Zeile code mal so ein Breakpoint und startest dann... Dadurch kann man genau rausfinden in welcher Zeile der Fehler passiert.
Du kannst übrigens auch die Werte von Variablen abfragen indem du mit der Maus über eine gehst...

Code: Alles auswählen

Signatur := nil;

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: external SIGSEGV

Beitrag von martin_frb »

Wann tritt der Fehler auf? Sofort beim Programm start oder später?

Falls sofort: Comodo firewall und bitdefender sind dafür bekannt diesen (oder ähnliche) Fehler, bei jedem Debug Vorgang mit gdb auszulösen.

Ansonsten:
http://wiki.lazarus.freepascal.org/GDB_Debugger_Tips

Beetle
Beiträge: 7
Registriert: Mi 1. Jun 2011, 19:02

Re: external SIGSEGV

Beitrag von Beetle »

Also ich habe bisher herausgefunden das es mehr am Installationspfad liegen könnte, denn nach dem ich das neu unter c:\lazarus installiert habe, wurde noch nicht wieder gemeckert.
Bei der ersten Installation war es unter c:\Program Files\Larazus\...
Aber ich komme bestimmt noch mit vielen Fragen.
Also vorerst erst einmal vielen Dank für diese Hilfe.
Gruß
Udo

Beetle
Beiträge: 7
Registriert: Mi 1. Jun 2011, 19:02

Re: external SIGSEGV

Beitrag von Beetle »

Ich habe nun mal UBUNITU Maverick Meerkat installiert und habe natürlich das gleiche Problem das die PostgreSQL Libs nicht gefunden werden. Kann mir jemand sagen wie der Pfad dahin ist? Ich finde soviele Verzeichnisse mit PostgreSQL. Gesucht wird in Lazarus wohl die libpg.so oder pglib.so. Aber die Datei als solches kann ich nicht finden.

Kann mir hier jemand noch mal helfen bitte!

Vielen Dank im Voraus

Nur zur Info die DB läuft und ich kann auch mit pgAdmin3 darauf zugreifen und arbeiten!

Gruß
Udo

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

Re: external SIGSEGV

Beitrag von theo »

Ist vielleicht das devel Paket nicht installiert. postgresql-devel oder so?

Beetle
Beiträge: 7
Registriert: Mi 1. Jun 2011, 19:02

Re: external SIGSEGV

Beitrag von Beetle »

Doch postgresql-devel ist installiert selbst libpg-java etc habe ich installiert!

Ich werde jetzt erst einmal unter Win7 anfangen zu coden, um die Ubuntu Installation kümmere ich mich dann später. es sei denn jemand hat jetzt eine spontane Lösung zur Hand.

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: external SIGSEGV bei umwandlung

Beitrag von Maik81ftl »

Moin Moin,

erst mal vorweg. ich schreibe mal in dem Thema weiter, da es sich sogesehen auch um einen SIGSEGV handelt. Dieser tritt bei mir in folgendes Zeile auf

Code: Alles auswählen

if (_Temp[E_leng] = '.') or (_Temp[E_leng] = ',') then


um euch nun mit Unnötigen Input zu verschonen kopier ich mal die Function rein, wo der Fehler austritt.


Code: Alles auswählen

Procedure TForm3.BMI;
var
  Edit: Array[0..1, 0..1] of String;
  temp: Real;
  _Temp: String;
  E_leng, Count: Byte;
begin
  Edit[0, 0]:= Edit4.Text;
  Edit[1, 0]:= Edit5.Text;
  Caption:= '';
  for Count:= 0 to 1 do
    begin
    _temp:= Edit[Count, 0];
    for E_leng := 0 to Length(_Temp) do
    begin
      Caption:= Caption + _Temp[E_leng] + '|';                     
      if (_Temp[E_leng] = '.') or (_Temp[E_leng] = ',') then      // <--- Auslösung des Fehlers.
      begin
        {$IFDEF WINDOWS}
        if _temp[E_leng] = '.' then Edit[Count, 1]:= _temp[E_leng] + ',';
        {$ENDIF}
        {$IFDEF LINUX}
//        {$ESLE}
        if _temp[E_leng] = '.' then Edit[Count, 1]:= _temp[E_leng] + '.';
        {$ENDIF}
        end
      else
        Edit[Count, 1]:= Edit[Count, 1] + _temp[E_leng];
      end;
    end;
end;


Kann den Fehler deshalb auf die Zeile eingrenzen, da ich die anderen alle Ausgeklammert hatte und dann rückwärts wieder rein genommen hab in's Proggi.

EDIT!!!
Fehler gefunden.
wurde 2 zeilen weiter oben erteugt, reagierte dann nur wo anders. :wink: :wink: :wink:

Code: Alles auswählen

[code=laz]Procedure TForm3.BMI;
var
  Edit: Array[0..1, 0..1] of String;
  temp: Real;
  _Temp: String;
  E_leng, Count: Byte;
begin
  Edit[0, 0]:= Edit4.Text;
  Edit[1, 0]:= Edit5.Text;
  Caption:= '';
  for Count:= 0 to 1 do
    begin
    _temp:= Edit[Count, 0];
    for E_leng := 0 to Length(_Temp) do                               // <--- Erzeugung des Fehlers. änderung in for E_leng := 1 to Length(_Temp) do löst es schon.
    begin
//      Caption:= Caption + _Temp[E_leng] + '|';                     
      if (_Temp[E_leng] = '.') or (_Temp[E_leng] = ',') then      // <--- Auslösung des Fehlers.
      begin
        {$IFDEF WINDOWS}
        if _temp[E_leng] = '.' then Edit[Count, 1]:= _temp[E_leng] + ',';
        {$ENDIF}
        {$IFDEF LINUX}
//        {$ESLE}
        if _temp[E_leng] = '.' then Edit[Count, 1]:= _temp[E_leng] + '.';
        {$ENDIF}
        end
      else
        Edit[Count, 1]:= Edit[Count, 1] + _temp[E_leng];
      end;
    end;
end;[/code]
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Fussel2011
Beiträge: 6
Registriert: Mi 31. Aug 2011, 09:02

Re: external SIGSEGV

Beitrag von Fussel2011 »

Hi also erstmal dein { if MySQLConnect.Connected then MySqlConnect.Close; }

ist zurecht auskommentiert:
1. If Bedingung in Klammern bitte,
2. dann mit begin / end; ...
3. Was prüfst du??

if (MySQLConnect.Connected = true / false ???) then
begin
MySqlConnect.Close;
end;

Wo erzeugst du die Instanz deiner MySQLConnect.... Klasse?
Ich meine, WO ist dein .create?

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: external SIGSEGV

Beitrag von Teekeks »

Fussel2011 hat geschrieben:Hi also erstmal dein { if MySQLConnect.Connected then MySqlConnect.Close; }

ist zurecht auskommentiert:
1. If Bedingung in Klammern bitte,
2. dann mit begin / end; ...
3. Was prüfst du??

if (MySQLConnect.Connected = true / false ???) then
begin
MySqlConnect.Close;
end;

Wo erzeugst du die Instanz deiner MySQLConnect.... Klasse?
Ich meine, WO ist dein .create?


Sorry, aber:

Was für einen schlechten Stil vertrittst du hier?

Zu 1. wir sind hier nicht in C, man kann bei einer solch unkomplexen Bedingung sehr gerne auf die Klammern verzichten, aber gut. Kann man machen.
Ebenso zum 2. Punkt: wozu bei nur einer einzelnen Bedingung extra ein begin/End drum setzen?
Damit bläst man doch den Quellcode nur unnötig auf und es kann bei längeren Quelltexten zu einer großen Unübersichtlich führen.

Und am wichtigsten: NIEMALS Boolsche Werte auf true oder falls auswerten, das kann gut schief gehen und Zeugt davon dass man den Sinn von Boolean nicht ganz verstanden hat.

Zu dem was schief gehen kann hier mal ein Link aus einem Delphi-Forum:
http://www.delphipraxis.net/57121-ueber-den-umgang-mit-boolean.html

Sorry dass ich das jetzt so kleinscheißerisch auseinander nehme, aber... nunja :)

Antworten