Форум: "Основная";
Текущий архив: 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.55 MB
Время: 0.038 c