Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Вниз

ехе закрывается сам по себе...   Найти похожие ветки 

 
Tom   (2004-06-02 10:56) [0]

Всем привет. Хочу поделится очень странной проблеммой. Странной потому что ума не приложу почему это происходит.
В дебагере все работает ОК. А вот ехе при работе внезапно закрывается сам по себе. (Случается редко но метко :) ) (никаких условних close-ov в программе нет) Программа использует блокируюшиий сокет и потоки. Что может это вызывать?


 
panov ©   (2004-06-02 10:57) [1]

Ошибка в программе.


 
Gero ©   (2004-06-02 10:59) [2]

А может и не в программе.
А может это только сон...


 
Smithson ©   (2004-06-02 11:00) [3]

Настройка ОС - не выводить сообшение об ошибке программы и завершать аварийную программу. Вот ее молча и закрывают.


 
Smithson ©   (2004-06-02 11:00) [4]

Удалено модератором


 
Tom   (2004-06-02 11:03) [5]

Если у кого опыт с этим посоветуйте какого рода ошибку искать?


 
Gero ©   (2004-06-02 11:05) [6]


> Если у кого опыт с этим посоветуйте какого рода ошибку искать?

Если программа компилируется, то точно не синтаксическую.


 
YurikGL ©   (2004-06-02 11:05) [7]

>какого рода ошибку искать

Искать в 17-й строке


 
Digitman ©   (2004-06-02 11:07) [8]


> Tom


если под дебагером все в порядке, то что-то, вероятно, связанное с нарушением межпоточной синхронизации


 
Tom   (2004-06-02 11:12) [9]

В дебагере за все время один раз был случай : выдало exception
с окошком F12(assembly) и при попытке отладки опять вылазило это окно->то есть невозможно было отследить где произошел exception.


 
Tom   (2004-06-02 11:17) [10]

Соообшение было : "Access Violation"


 
Digitman ©   (2004-06-02 11:18) [11]


> В дебагере за все время один раз был случай : выдало exception


уже подозрительно


> с окошком F12(assembly) и при попытке отладки опять вылазило
> это окно->то есть невозможно было отследить где произошел
> exception.


всегда можно на том или ином уровне отследить. при выполнении какого участка возбуждается исключение !

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


 
Тимохов ©   (2004-06-02 11:19) [12]


> Если у кого опыт с этим посоветуйте какого рода ошибку искать?

скажу честно и без издевки - такие ошибки можно искать (если они не нашлись за первые 2 часа) только правильным переписыванием всего... :(( Ну или хотя бы просмотром кода, возможно, с его переработкой.


 
Tom   (2004-06-02 11:23) [13]

Насколько понимаете в Ассемблере ни в зуб ногой (жаль но так). Потому вопрос: как по этому окошку понять в каком модуле проблемма?


 
Tom   (2004-06-02 11:24) [14]

>>Тимохов
O переписке и думать не хочется (4 месяца работы) потому попытаюсь искать.


 
Digitman ©   (2004-06-02 11:25) [15]


> Tom   (02.06.04 11:17) [10]
> Соообшение было : "Access Violation"


не могло быть оно таким !

а могло быть ТОЛЬКО таким : "Access Violation at ..."

вот это самое at ... и дает весьма предметную инф-цию для исследования причин


 
Тимохов ©   (2004-06-02 11:27) [16]


> Tom   (02.06.04 11:24) [14]

ищите.

если вы уж решили искать, то попробуйте все куски кода обрамить в try except для того, чтобы все ошибки кидать в лог. например, в текстовый файл (пишите в него текст ошибки, id потока). уже будет какая-то информация.

я бы с этого начал
имхо


 
Tom   (2004-06-02 11:31) [17]

>>Тимохов
В том то и дело что имеется даже ApplicationEvent  который OnException пишет в лог но он ничего не дал!

>>Digitman
А как по этому адресу понять где ошибка?


 
Тимохов ©   (2004-06-02 11:33) [18]


> Tom   (02.06.04 11:31) [17]

applicationevent не дает исключений, которые возникли в потоках...
если у вас есть необработанное исключение в excute, то поток пректатится а ислкюченией сохранится в fatalexception. Вы должны его сами обработать в onterminate.


 
Tom   (2004-06-02 11:38) [19]

Ок,попробую обработать fatalexception посмотрим на результаты.
Дело еще в том что на три дня тестирования это один раз случилось так что придется ждать :)
Спасибо за помощ! Буду сообщать о развитии.


 
Digitman ©   (2004-06-02 11:43) [20]


> А как по этому адресу понять где ошибка?


в ран-тайм в try..except-обработчике исключения можно выделить из строки сообщения этот адрес, преобразовать его к типу pointer, далее выполнить FindHInstance(адрес), и если результат ф-ции не равен nil выполнить GetModuleFileName(), получив имя файла PE-модуля .. тем самым ты сразу определишь, происходит ли искл-е в PE-модуле самого приложения либо оно происходит в одном из статически/динамически загружаемых PE-модулях библиотек


 
Digitman ©   (2004-06-02 11:50) [21]


> Tom


настоятельно рекомендую во всех методах Execute() всех поточных классов сделать следующее :

procedure TMyThread.Execute;
begin
try
  ... здесь собственно алгоритм поточного метода
except
  on E:Exception do
   WriteLog(e.Classname + " " + e.Message + " " + ClassName + " " + InttoStr(ThreadId)); //запись в протокол инф-ции о любом потенциальном непредвиденном исключении
end;
end;

разумеется. ф-ция WriteLog д.б. потокобезопасной


 
Verg ©   (2004-06-02 11:57) [22]

Стек где-то иногда "грохаешь".

Пример:
type
  Tb = array[0..4095] of byte;
  Pb = ^Tb;

procedure SomeFunction;
var B : Pb;
begin
..........
  GetMem(B, sizeof(Tb));
..........
..........
  FillChar(B, sizeof(Tb), 0);
..........
end;


 
Digitman ©   (2004-06-02 12:00) [23]


> Verg ©   (02.06.04 11:57) [22]


а запросто, кстати ..

абсолютно реальная ситуация, когда процесс снимается системой втихомолку


 
Тимохов ©   (2004-06-02 12:04) [24]

АВТОРУ.
Может интересно будет, сделал тут как говорит Digitman (самому интересно было).

type
  TTestObject = class
     a: integer;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  kO: TTestObject;
  kHI: LongWord;
  kBuffer: packed array [0..1024] of char;
begin
  kO := nil;
  try
     kO.a := 2; // генерация исключения
  except
     on kE:EAccessViolation do
     begin
        kHI := FindHInstance(kE.ExceptionRecord.ExceptionAddress);
        GetModuleFileName(kHI, kBuffer, SizeOf(kBuffer));
        ShowMessage(kBuffer); // покажет имя модуля
        raise;
     end;
  end;
end;


 
Digitman ©   (2004-06-02 12:21) [25]


> Тимохов ©   (02.06.04 12:04) [24]


в случае, на который намекает Verg, эта инф-ция, даже если она будет получена, попросту бесполезна, ибо при "уродовании" содержимого стэка возврат из п/п может произойти как в любой непредcказуемый модуль, так и в "никуда"


 
Игорь Шевченко ©   (2004-06-02 12:47) [26]

Совет - включить в настройках компилятора ВСЕ проверки


 
Григорьев Антон   (2004-06-02 13:30) [27]


> Насколько понимаете в Ассемблере ни в зуб ногой (жаль но
> так). Потому вопрос: как по этому окошку понять в каком
> модуле проблемма?


Посмотреть окно стека. Там можно понять, из какой функции произошёл вызов ассемблерного кода.


 
Anatoly Podgoretsky ©   (2004-06-02 13:42) [28]

Нечего смотреть если стек разрушен



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

Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.03 c
8-1081153095
$tranger
2004-04-05 12:18
2004.06.13
Работа с УЧАСТКОМ картинки


1-1085992081
Erik1
2004-05-31 12:28
2004.06.13
Как в наследнике TCollectionItem добавить атрибут из списка?


14-1085738439
syte_ser78
2004-05-28 14:00
2004.06.13
Учебник по Turbo Vision


3-1085402689
Cyber
2004-05-24 16:44
2004.06.13
создание Query-запросов


1-1086151146
Maestro
2004-06-02 08:39
2004.06.13
access violation и Abstract error для чайников





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский