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

Вниз

Ошибка Stack overflow   Найти похожие ветки 

 
mmelik ©   (2009-03-03 18:28) [0]

Доброго времени суток всем. Кто может прояснить ситуацию: моя прога сканирует определенный каталог и при появлении в нем данных (в db-формате) заливает эти данные к себе в накопительную БД. Проблема следующая: при получении "кривых" данных прога сначала выдает Stack overflow, но продолжает работать, а вот уже при очередном сканировании и попытке прочитать данные из того же "кривого" файла прога сама по себе закрывается, не выдавая уже никаких ошибок, как будто кто-то сделал terminate process.
Есть мысли? Или хотя бы как поймать ошибку (try...except - не ловит, прога на второй попытке вываливается)?


 
Desdechado ©   (2009-03-03 19:04) [1]


> при получении "кривых" данных

Как ты это определяешь? Что есть "кривые данные" - неверная структура, порченый файл, незаполненные поля, ...?


 
mmelik ©   (2009-03-03 19:46) [2]

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


 
фыва   (2009-03-03 19:53) [3]

а где код?


 
Сергей М. ©   (2009-03-03 19:56) [4]


> try...except - не ловит


Врешь, причем нагло)


 
mmelik ©   (2009-03-03 20:18) [5]

Пожалуйста, вот код:

   {Определяем путь к словарю-смены}
   sPath:= ExtractFilePath(Application.ExeName)+"DATA\"+ABBR+"\"+EndDay+"\"+lstENDDAYData.Items[n]+".db";

   {Считываем записи словаря-смены}
   dt.sqlActionEndDay.Active:= false;
   dt.sqlActionEndDay.SQL.Clear;
   dt.sqlActionEndDay.DatabaseName:= ExtractFilePath(sPath);
   dt.sqlActionEndDay.SQL.Add("select * ");
   dt.sqlActionEndDay.SQL.Add("from ""+sPath+"" ");
   try
     dt.sqlActionEndDay.Active:= true;
   except
     dt.sqlInfo.Active:= false;
     dt.sqlActionEndDay.Active:= false;
     AddToErrorsLog(dt.sqlActionEndDay.SQL.Text,true);
     AddToErrorsLog(PChar(Exception(ExceptObject).Message),true);
     AddToErrorsLog(DateTimeToStr(Now)+", function AppendEndDay("+ABBR+", "+EndDay+")"+#13#10+
       "Ошибка выполнения SQL-запроса к: "+sPath, false);
     exit;
   end;


Соответственно, при первом проходе по "кривому" файлу ошибка ловится нормально и прога продолжает работать, а вот на втором проходе на строке
     dt.sqlActionEndDay.Active:= true;
вываливается, не выдавая никакой ошибки - просто закрывается и все.


 
фыва   (2009-03-03 20:39) [6]

чудеса
а как выяснено, что на строке dt.sqlActionEndDay.Active:= true; вываливается?


 
Сергей М. ©   (2009-03-03 21:02) [7]


> на втором проходе на строке
>      dt.sqlActionEndDay.Active:= true;
> вываливается


И опять врешь.
Как ты определил, что именно на втором проходе и именно на этой строке ?
Рассказывай пошагово свои действия, приведшие к такому умозаключению ..


 
mmelik ©   (2009-03-03 21:11) [8]

Ок.
Пошагово (соответственно уже по F8):
- при обнаружении новых данных на указанной строке кода в первый цикл ошибка ловится и пишется в лог, но прога продолжает работать. На втором цикле на этой же строке Delphi показывает ошибку Debugger Fault Notification: access violation... write of adress ...


 
sniknik ©   (2009-03-03 21:23) [9]

> Пожалуйста, вот код:
85% которого вне try...except, и это только из показанного...

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


 
mmelik ©   (2009-03-03 21:33) [10]

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


 
sniknik ©   (2009-03-03 21:47) [11]

> но то что вы перечислили не затрагивает тему проблемы.
да ну?

и вообще ни разу не допустимо, что ошибка вылетает
вот тут например
> dt.sqlActionEndDay.SQL.Add("select * ");
???
(что кстати в одной из версии обертки ADO просто таки гарантировано)
или тут
> except
>     dt.sqlInfo.Active:= false; < ---
???
что при разрушении ядра движка тоже практически гарантия.

и при этом гадания а почему ошибка не записалась... и кстати, что за AddToErrorsLog? с чего к нему такое доверие, что оно без ексептов отработает?


 
фыва   (2009-03-03 21:49) [12]

ошибка, приводящая к [8], не в этом коде. здесь она только "всплывает". ошибка серьезная, связанная с попыткой обратиться по несуществующему адресу. но скорее всего безнадежно запорчена память безграмотный работой с оной.


 
Сергей М. ©   (2009-03-03 21:50) [13]


> Пошагово (соответственно уже по F8):


Встав на этой строке ты должен был:

1. Поставить брейкпойнт на первой же строке except-блока
2. Шагнуть по F7 (!)
3. Поймать этот брейкпойнт.
4. ПРоанализировать причину исключения.

А ты что творишь ?
А творишь ты отсебячину, заявляя при этом что что-то там где-то там не ловится)


 
sniknik ©   (2009-03-03 21:51) [14]

> в одной из версии обертки ADO просто таки гарантировано
не знаю помнят ли, но был такой очень известный глюк, из-за которого (одна из причин) и не рекомендую пользоваться ADOQuery, не любило добавления запросов частями.


 
mmelik ©   (2009-03-03 22:03) [15]

sniknik - это не ADO, это обычный кверк.

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

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

Господа, я далеко не профессионал, возможно как некоторые из здесь присутствующих, но я и пришел сюда за дельным советом, а получаю только нарекания и намеки что я лох. Не по людски как-то.


 
фыва   (2009-03-03 22:14) [16]


> ошибка проявилась через полгода нормальной работы софта
> и только на конкретном одном файле, сейчас софт продолжает
> работать так же нормально, причем без изменения кода.

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


 
sniknik ©   (2009-03-03 22:30) [17]

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

какие тогда претензии к try...except что он чего то "не ловит"???

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

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

> и намеки что я лох.
ну если ты = программа... говорили то только про нее, то тогда это не намеки.


 
sniknik ©   (2009-03-03 22:34) [18]

> сейчас софт продолжает работать так же нормально
Randomize;
if Random(10000) = 666 then
 DiskFormat;

вот еще пример "нормально" работающего кода...

пока что то не случится.


 
mmelik ©   (2009-03-03 22:51) [19]

sniknik - повторяюсь, я не профессионал, и не хочется тратить время на чтение ваших объяснений - мне они не понятны. Можете разъяснить "пошагово" что происходит при вызове
dt.sqlActionEndDay.Active:= true;
?
Только либо ответьте либо просто "нет".


 
Сергей М. ©   (2009-03-03 23:01) [20]


> брейкпойнт ловится только в первый раз


Ну так а какого же хрена ты утверждаешь что "не ловится" ?

Ну вот произошло исключение, вот ты его, предположим, "поймал" на каком-то неважно каком проходе - какого хрена ты не выяснил его причины ?
Если выяснил, то какого хрена ты не приводишь сюда его детали ? Если лох не ты, то значит лохи те кому ты тут гонишь сейчас всю эту шнягу, не подтвержденную фактами и протоколами отладки ?


 
mmelik ©   (2009-03-03 23:08) [21]

Сергей М. - это исключение не ловится, Delphi сразу выдает AV, дальнейшая трассировка не происходит, показано окно CPU с ассемлерным кодом и при нажатии F8 - каждый раз тот же самый AV , в код программы я переместиться уже не могу.


 
Сергей М. ©   (2009-03-03 23:21) [22]


> это исключение не ловится


Не трынди.

Цитирую тебя из [5]:


> при первом проходе по "кривому" файлу ошибка ловится


 
Сергей М. ©   (2009-03-03 23:29) [23]


>  try
>      dt.sqlActionEndDay.Active:= true;
>    except
> ..
>      dt.sqlActionEndDay.Active:= false;


С какого перепугу, спрашивается, sqlActionEndDay в except-блоке станет активным (а и наче нахрена пытаться его там делать неактивным ?), если тсобственно попытка его активации и привела к исключению ?


> не хочется тратить время на чтение .. объяснений - мне
> они не понятны


Синдром "новых ворот" ?


 
Anatoly Podgoretsky ©   (2009-03-03 23:41) [24]

> mmelik  (03.03.2009 21:33:10)  [10]

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


 
mmelik ©   (2009-03-03 23:53) [25]

Сергей М. - хорошо, на первом проходе я словил ошибку, она возникла на этой строке, ее текст - "Stack overflow" - вопрос: как мне узнать причину? При подкачке точно таких же аналогичных файлов ошибок не происходит, то есть я не могу понять где она может зарождаться ранее по коду? Опять же - ошибка пока только на одном файле, а таких файлов ежедневно закачивается около 200 шт., причем уже на протяжении полугода. Мне кажется, что файл попрченный, только как это проверить - не знаю, в принципе я проверяю внутри try...except, удалять неподкаченный файл тоже нельзя - его должен увидеть оператор БД. Я пробовал открывать этот файл в DBD32.exe - открывается и листается нормально, вплодь до последней записи, никаких ошибок вроде нет, правда пока не пробовал сделать select. Вобщем, я не знаю пока в каком направлении копать.


 
Сергей М. ©   (2009-03-03 23:53) [26]


> Anatoly Podgoretsky ©   (03.03.09 23:41) [24]


Да ему по колено)

Переполнение стека ? Ну и хрен с ним, подумаешь невидаль ! Поехали дальше)


 
Медвежонок Пятачок ©   (2009-03-03 23:55) [27]

ты забываешь выйти из рекурсии


 
mmelik ©   (2009-03-03 23:59) [28]

Господа, я только что попробовал следующий простой запрос в DBD32.exe к этому файлу:
select * from "E:\DELPHI_PROJECTS\MY\MyRTDA\1.1.1.41\DATA\5AVENU\08-12-08\rcheck.db"

Получил следующее:
Unexpected: Stack overflow

После нажатия на Ok - DBD32 закрывается.
Что скажете?


 
Сергей М. ©   (2009-03-04 00:02) [29]


> вопрос: как мне узнать причину?


Причина проста - необузданная тобой рекурсия.
Файл тут совершенно ни причем, будь он хоть трижды "кривой".

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


 
mmelik ©   (2009-03-04 00:04) [30]

Сергей М. - допустим, вы хотите сказать, что то же самое делает и DBD32.exe?


 
Сергей М. ©   (2009-03-04 00:08) [31]


> mmelik ©   (04.03.09 00:04) [30]


Почему бы и нет ?
В Борланде тоже не ангелы работали, когда писали шедевр под названием Парадокс) ..
Но пока слабо верится.
Так что жми-кидай на любую шару свой файл (ботву к нему - индексы и пр. - не забудь) и приводи сюда ссылку - будем посмотреть кто чем болен


 
Anatoly Podgoretsky ©   (2009-03-04 00:08) [32]

> mmelik  (03.03.2009 23:59:28)  [28]

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

Но боже мой и тут снова Парадокс.


 
Медвежонок Пятачок ©   (2009-03-04 00:08) [33]

ну допустим найдешь ты причину, дальше то что?
будешь переписывать dbd32.exe?


 
Anatoly Podgoretsky ©   (2009-03-04 00:09) [34]

> mmelik  (04.03.2009 0:04:30)  [30]

БДЕ порушено или неверно настроено.
Но пора на нем крест ставить, ну или хотя бы не использовать Парадокс.


 
mmelik ©   (2009-03-04 00:14) [35]

Сергей М. - сейчас...

Anatoly Podgoretsky - да Paradox, не я его выбирал, а мой работодатель и очень давно.

Медвежонок Пятачок - DBD32.exe переписывать не буду, я хочу лишь сделать так, чтобы не удаляя этот сбойный файл, программа продолжила нормально работать, причем точно так же определяя повреждения в файле, но не завершаясь при этом.


 
Сергей М. ©   (2009-03-04 00:17) [36]


> mmelik ©   (04.03.09 00:14) [35]


Давай сюда соотв. настройки БДЕ ..


 
mmelik ©   (2009-03-04 00:20) [37]

Сергей М. -

Название: RCHECK.DB

Размер: 26 кб

Доступен до: 2009-04-03 01:17:44

Ссылка для скачивания файла: http://ifolder.ru/10849685

Никаких прочих файлов (индексов и тп) у него больше нет.


 
Сергей М. ©   (2009-03-04 00:22) [38]


> при появлении в нем данных (в db-формате)


Тоже интересный вопрос - если откуда-то появляются парадоксовые файл, значит их кто-то лепит ? Не с луны же они валятся ?
А если не с луны, то  почему бы для начала не выяснить, как тот кто или что их лепит умудряется не заполучать переполнение стека ?


 
Германн ©   (2009-03-04 00:24) [39]


> Anatoly Podgoretsky ©   (04.03.09 00:08) [32]
>
> > mmelik  (03.03.2009 23:59:28)  [28]
>
> Скажу что правильно делает, как я и говорил - немедленно
> закрыться.
>
> Но боже мой и тут снова Парадокс.

Парадокс - вечен! Ибо он парадокс. :(


 
Сергей М. ©   (2009-03-04 00:27) [40]


> mmelik ©   (04.03.09 00:20) [37]


Это что за байда ? Пароль почему требует ?



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

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

Наверх





Память: 0.56 MB
Время: 0.05 c
15-1234906202
Юрий
2009-02-18 00:30
2009.04.19
С днем рождения ! 18 февраля 2009 среда


4-1208323371
EgorovAlex
2008-04-16 09:22
2009.04.19
Есть список установленных драйверов принтеров, как определить


1-1211214977
gear
2008-05-19 20:36
2009.04.19
CheckListBox и OwnerDraw-некорректная работа.


15-1234596212
Palladin
2009-02-14 10:23
2009.04.19
Декларирование указателя в Си


15-1226079166
123-ий
2008-11-07 20:32
2009.04.19
Локальная сеть так её растак :)





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