Форум: "Основная";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
ВнизПочему программа просто исчезает? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.05 c