![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему программа просто исчезает? [D7, WinXP]
Vilux © (2004-11-16 09:52:00)Программе все время висит подключенной к порту в инете, использует многопоточность и в потоке пускает dll-ку. В определенный момент программа просто исчезает...ни сообщение об ошибке, ничего... просто была и исчезла как процесс... я даже не знаю, в какую сторону копать?
kostan (2004-11-17 07:09:00) [1]все дело скорее всего в Dll
заключи ВСЕ (ну или почти все :) критичные участки кода в ней
в Try Except)
при падении DLL может упасть все - :()
Vilux (2004-11-17 07:05:00) [2]Написал нижеприведенный код, получается так, что обработчик исключения срабатывает только в потоке, после этого все рушится.
Если обработчик исключений в потоке убрать, то те обработчики исключений, что в самой программе все-равно не срабатывают и программа "падает".
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.
Defunct (2004-11-16 15:37:00) [3]дополню совет от Digitman, не лишним также будет
procedure Txx.GlobalException(Sender: TObject; E:Exception);
begin
Application.MessageBox(PChar('Возникло непредусмотренное мной исключение класса ' + Sender.ClassName + ' с диагностикой ' + E.message'), 'Большая беда!', mk_ok + 16);
end;
Application.OnExeption := GlobalException;
Verg (2004-11-16 13:46:00) [4]
> попробовал отловить исключение... оно срабатывает, а уже
> потом программы мрет...это уже лучше...
Из-под Дельфи запускал проверить обработчик исключения в этом случае ?
Потому как на "чистый" запуск такие ошибки валят процесс не взирая на обработчики исключений. Просто от размера зависит (тот, который 4096)
Digitman (2004-11-16 13:45:00) [5]заключи тело поточной ф-ции в блок try..except :
try
.. что-то там
except
//безусловная обработка всех "непогашенных" исключений
//нужна по кр.мере в целях отладки до тех пор пока не будут
//исправлены все ошибки в алгоритме, приводящие к непредсказуемым по логике исключениям
on e:Exception do
messagebox(0, PChar('Трэд ' + IntToStr(ThreadId) + ' вызвал непредусмотренное мной исключение класса ' + e.classname + ' с диагностикой "' + e.message + '"'), 'Беда !', mb_ok or mb_setforeground);
end;
Vilux (2004-11-16 13:27:00) [6]Все бы ничего, но дело осложняется тем, что нет закономерности, когда это происходит... может сутки отработать, а может через 10 минут свалиться. Я грешу на многопоточность почему-то...хотя буду искать возможные проблемы с памятью...
провел эксперимент, создал вышеописанную Verg'ом ситуацию в отдельном потоке... навернулась вся программа, по "тихому". Но попробовал отловить исключение... оно срабатывает, а уже потом программы мрет...это уже лучше...хотя в моей программе на каждом шагу обработка исключений... однако это не помогает пока отловить причину такого поведения.
Спасибо за советы...
Если больше идей нет.. буду искать недочеты в работе с памятью...
Reindeer Moss Eater (2004-11-16 10:03:00) [7]Скорее первое чем второе
Verg (2004-11-16 10:01:00) [8]Копай в сторону порчи стека, путем записи в локальную переменную процедуры данных размером намного превышающих размер самой переменной.
Пример:
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 09:54:00) [9]Копай в сторону обработки всехисключений во вторичных потоках.