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

Вниз

Access violation   Найти похожие ветки 

 
mid   (2004-11-24 12:11) [0]

Кто подскажет как отловить что происходит?

На Delphi7 написан сервер приложений работает c БД круглосуточно в режиме 7x24.
Все хорошо если не одно но, по непонятной причине и с непонятной
переодичностью примерно раз в (3-5 дней) вылетает Access violation и на этом все заканчивается.


 
Digitman ©   (2004-11-24 12:14) [1]


> mid


ищи ошибки в алгоритме своего апп-сервера


 
TUser ©   (2004-11-24 12:16) [2]

1. try ... except на все подозрительные участки кода
2. писать логи - какие участки выполняются правильно, а какие с ошибкой + наверное, значения переменных
3. когда будет понятно, что ошибка в такой-то процедуре - аналогичным способом определить, в какой конкретно строке.
4. потом - думать, думать, думать ...


 
mid   (2004-11-24 12:51) [3]

try ... except там и так есть больше чем необходимо к сожалению они спасают не всегда, предлагаю попробовать перейти по адрессу 00000000 и посмотреть как в этом случае поможет try ... except


 
Суслик ©   (2004-11-24 12:54) [4]


> как в этом случае поможет try ... except

поможет понять, ГДЕ в твоем коде это тебе предлагают...


 
TUser ©   (2004-11-24 13:05) [5]

Если AV в 0000000, то значит обращение по адресу nil. Какой-то объет не создан, например.


 
mid   (2004-11-24 14:32) [6]

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


 
TUser ©   (2004-11-24 14:34) [7]


> происходит разрушение памяти

бедный сервер ...

> не писать же логи после каждой инструкции

может и писать ...


 
mid   (2004-11-24 15:05) [8]

>может и писать ...

Даже если не считать сколько это потребует времени...

Прежде чем заняться этим увлекательным занятием может кто-нибудь подскажет что то более интересное


 
TUser ©   (2004-11-24 15:06) [9]

Тут недавно обсуждался JclDebug.pas. Что это такое - не знаю, я его ни разу не использовал. Но может поможет?


 
Digitman ©   (2004-11-24 15:14) [10]


> предлагаю попробовать перейти по адрессу 00000000


а ты не ходи по этому адресу.
тебя ж никто туда не посылает ...

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


 
mid   (2004-11-24 15:29) [11]

>тебя ж никто туда не посылает ...

Почему такая уверенность, сделайте map файл и посмотрите сколько всего там используется кроме написаного вами кода, хотя бы так


 
Anatoly Podgoretsky ©   (2004-11-24 15:57) [12]

Да но ошибка не там, а в твоем коде и тебе предстоит веселое занятие.


 
mid   (2004-11-24 16:11) [13]

>Да но ошибка не там, а в твоем коде  

A если, например, я вызываю какую-то ф-ию из какой-то библиотеки,например MsXml.dll, и она вместо нужного результата приводит к Access violation это по вашему чья ошибка?


 
Anatoly Podgoretsky ©   (2004-11-24 16:15) [14]

Да если ты в нее передашь неверный адрес, так и будет Access violation и сообщение об ошибке в той функции.


 
wal ©   (2004-11-24 16:17) [15]

Естественно твоя, если ты вызываешь функцию, которая может привести к исключению, а ты его не обрабатываешь.

С уважением.


 
Anatoly Podgoretsky ©   (2004-11-24 16:26) [16]

wal ©   (24.11.04 16:17) [15]
И это тоже, но как правило передаются неверные данные в функцию.


 
mid   (2004-11-24 16:26) [17]

ТО wal ©  

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


 
Anatoly Podgoretsky ©   (2004-11-24 16:37) [18]

try
  func(nil);
except
  ...
end;


 
wal ©   (2004-11-24 16:42) [19]

>mid   (24.11.04 16:26) [17]
Библиотека lib.dpr

library lib;
uses
 SysUtils,
 Classes;

{$R *.res}
function AV:Byte;stdcall;
var p: PByte;
begin
 p:= nil;
 Result := p^
end;

exports AV;

begin
end.

Программа, модуль с формой и кнопкой:

...
function AV:byte;stdcall;external "lib.dll";
...
procedure TForm1.Button1Click(Sender: TObject);
begin
try
  Caption := IntToStr(AV)
except
  Caption := "Error"
end;
end;

Красиво пишет Error в заголовке, а Вы чего ожидали?


 
Anatoly Podgoretsky ©   (2004-11-24 16:45) [20]

wal ©   (24.11.04 16:42) [19]
function AV(P: Pointer):Byte;stdcall;
begin
  Result := p^
end;

IntToStr(AV(nil))


 
wal ©   (2004-11-24 16:47) [21]

>Anatoly Podgoretsky ©   (24.11.04 16:45) [20]
Ничего не имею против, результат от этого не измениться.


 
mid   (2004-11-25 17:19) [22]

Ничего не имею против, но повторяю что Try except не на все случаи жизни иногда он не спасает, бывает так что при вызове какой то из функций из какой то библиотеки приводит к тому что программа завершается аварийно и до вашего внешнего except она никогда не дойдет


 
Anatoly Podgoretsky ©   (2004-11-25 17:23) [23]

Абсолютно точно и отсюда исправлять ошибки в программе, что бы во внешние функции не поступали недостоверные данные.


 
KSergey ©   (2004-11-25 17:28) [24]

>  [22] mid   (25.11.04 17:19)

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

> [19] wal ©   (24.11.04 16:42)
> Красиво пишет Error в заголовке

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


 
mid   (2004-11-25 17:45) [25]

To KSergey ©

По поводу второй части полностью согласен, да и первой тоже,

ну в общем то вопрос и был в том как с минимальными затрвтами найти именно то место где это происходит, одно из решений было
предложено TUser ©   (24.11.04 15:06) [9] за что ему спасибо, хотя нормальный пакет JclDebug который бы компилился я пока не нашел


 
KSergey ©   (2004-11-26 11:46) [26]

> mid   (25.11.04 17:45) [25]
> хотя нормальный пакет JclDebug который бы компилился я пока
> не нашел

Странно... Простой поиск по этой конфе ;)

http://delphimaster.net/view/1-1100789422/
http://www.delphi-jedi.org


 
ShotGuN ©   (2004-11-26 15:16) [27]

В закладке Additional палитры компонент Дельфы есть такая штука под названием ApplicationEvents. У этой штучки есть событие OnException. Отсюда можно вести лог. Потом просмотрев лог и узнав где именно вылетает ошибка можно проанализировать почему. Вот... А если не использовать в этом событии   try finally except  raise, то вообще никакие ошибки не будут вылетать, даже если они на самом деле будут :). И все будут счастливы.. может быть :)


 
KSergey1   (2004-11-26 17:26) [28]

> ShotGuN ©   (26.11.04 15:16) [27]
> Потом просмотрев
> лог и узнав где именно вылетает ошибка

Выделенное можно прокомментировать? Как это сделать? Как узнать "где именно"?



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

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

Наверх





Память: 0.65 MB
Время: 0.068 c
9-1091894388
new developer
2004-08-07 19:59
2004.12.12
массив в массиве


1-1101732165
Bobby Digital
2004-11-29 15:42
2004.12.12
Restart


14-1101226654
ИМХО
2004-11-23 19:17
2004.12.12
Агентства переводов


14-1101037120
Новичек
2004-11-21 14:38
2004.12.12
Посмейтесь, Мастера :-)


9-1087490521
Drinkins
2004-06-17 20:42
2004.12.12
Зацените Кубик-Рубик (http://NikoVOsade.narod.ru/Cub__r.rar)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский