Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

Почему программа просто исчезает?   Найти похожие ветки 

 
Vilux ©   (2004-11-16 09:52) [0]

Программе все время висит подключенной к порту в инете, использует многопоточность и в потоке пускает dll-ку. В определенный момент программа просто исчезает...ни сообщение об ошибке, ничего... просто была и исчезла как процесс... я даже не знаю, в какую сторону копать?


 
Reindeer Moss Eater ©   (2004-11-16 09:54) [1]

Копай в сторону обработки всех исключений во вторичных потоках.


 
Verg ©   (2004-11-16 10:01) [2]

Копай в сторону порчи стека, путем записи в локальную переменную процедуры данных размером намного превышающих размер самой переменной.

Пример:

Type
 TBuffer = array[0..4095] of byte;
...........................
..........................
procedure SomeProc;
var B : ^TBuffer;
begin
  GetMem( B, sizeof(TBuffer) );

  FillChar( B, sizeof(TBuffer), 0 );
  // Вместо FillChar может быть чт-то другое
  // Stream.Read( B, Sizeof(TBuffer) );
  // Move(......

.......................

Выше - элементарная опечатка B^ -> B
И все, процесс "падает без шуму и пыли".


 
Reindeer Moss Eater ©   (2004-11-16 10:03) [3]

Скорее первое чем второе


 
Vilux ©   (2004-11-16 13:27) [4]

Все бы ничего, но дело осложняется тем, что нет закономерности, когда это происходит... может сутки отработать, а может через 10 минут свалиться. Я грешу на многопоточность почему-то...хотя буду искать возможные проблемы с памятью...
провел эксперимент, создал вышеописанную Verg"ом ситуацию в отдельном потоке... навернулась вся программа, по "тихому". Но попробовал отловить исключение... оно срабатывает, а уже потом программы мрет...это уже лучше...хотя в моей программе на каждом шагу обработка исключений... однако это не помогает пока отловить причину такого поведения.
Спасибо за советы...
Если больше идей нет.. буду искать недочеты в работе с памятью...


 
Digitman ©   (2004-11-16 13:45) [5]

заключи тело поточной ф-ции в блок try..except :

try
.. что-то там
except

//безусловная обработка всех "непогашенных" исключений
//нужна по кр.мере в целях отладки до тех пор пока не будут
//исправлены все ошибки в алгоритме, приводящие к непредсказуемым по логике исключениям

 on e:Exception do
  messagebox(0, PChar("Трэд " + IntToStr(ThreadId) + " вызвал непредусмотренное мной исключение класса " + e.classname + " с диагностикой "" + e.message + """), "Беда !", mb_ok or mb_setforeground);

end;


 
Verg ©   (2004-11-16 13:46) [6]


> попробовал отловить исключение... оно срабатывает, а уже
> потом программы мрет...это уже лучше...


Из-под Дельфи запускал проверить обработчик исключения в этом случае ?

Потому как на "чистый" запуск такие ошибки валят процесс не взирая на обработчики исключений. Просто от размера зависит (тот, который 4096)


 
Defunct ©   (2004-11-16 15:37) [7]

дополню совет от Digitman, не лишним также будет

procedure Txx.GlobalException(Sender: TObject; E:Exception);
begin

 Application.MessageBox(PChar("Возникло непредусмотренное мной исключение класса " + Sender.ClassName + " с диагностикой " + E.message"), "Большая беда!", mk_ok + 16);

end;

Application.OnExeption := GlobalException;


 
Vilux ©   (2004-11-17 07:05) [8]

Написал нижеприведенный код, получается так, что обработчик исключения срабатывает только в потоке, после этого все рушится.
Если обработчик исключений в потоке убрать, то те обработчики исключений, что в самой программе все-равно не срабатывают и программа "падает".
2Verg, запускал не только под Дельфи

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure GlobalException(Sender: TObject; E:Exception);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

TMyThread = class(TThread)
protected
  procedure Execute; override;
public
end;

TBuffer = array[0..4095] of byte;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TMyThread.Execute;
var B : ^TBuffer;
f:textfile;
begin
 GetMem( B, sizeof(TBuffer) );
 try
   FillChar( B, sizeof(TBuffer), 0 );
 except;
   assignfile(f,"err.txt");
   rewrite(f);
   writeln(f,timetostr(now));
   closefile(f);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Application.OnException:=GlobalException;
 with TMYThread.Create(true) do
 begin
 try
   FreeOnTerminate:=true;
   Resume;
 except
   showmessage("ErrorMain");
   free;
 end;
 end;
end;

procedure TForm1.GlobalException(Sender: TObject; E:Exception);
begin
Application.MessageBox(PChar("Возникло непредусмотренное мной исключение класса " + Sender.ClassName + " с диагностикой " + E.message), "Большая беда!", mb_ok + 16);
end;

end.


 
kostan ©   (2004-11-17 07:09) [9]

все дело скорее всего в Dll
заключи ВСЕ (ну или почти  все :) критичные участки кода в ней
в Try Except)
при падении DLL может упасть все - :()



Страницы: 1 вся ветка

Текущий архив: 2004.11.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.055 c
1-1100276038
Petia
2004-11-12 19:13
2004.11.28
Форма


14-1100004423
TRyaSS
2004-11-09 15:47
2004.11.28
Кто знает C(си), помогите плз. перевести


14-1099952659
Lancelot
2004-11-09 01:24
2004.11.28
Почитать :)


1-1100531696
PC
2004-11-15 18:14
2004.11.28
ScrollBar в окне с BorderStyle = bsNone


3-1098930931
SDA
2004-10-28 06:35
2004.11.28
Как красиво удалить #tmp таблицу???!!!