Paranoik |
Отправлено: 30.07.2003, 19:28 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 12
|
Прога на Builder 6.
Программа работает с базой данных access через jet.
Проблема в том, что при закрытии моей программы выскакивают подряд три ошибки (под Win XP Pro):
1. "обнаружена ошибка. Приложение будет закрыто..."
2. ещё одно, точно такое же...
3. "Project1.exe: Abnormal program termination"
Как-либо на работу программы или на какие-то важные вещи это никак не влияет. Но вот напрягает уж очень сильно...
Причем эта порция ошибок либо есть, либо нет. Т.е. в какой-то раз можно закрыть программу без этих неприятных последствий.
Конечно понятно, что просто так совершенно невозможно указать на ошибку, но я просто не знаю с чего начать её локализацию. Хотя бы для начала может есть возможность избавиться от сообщений об ошибках? Так же незнаю какую информацию о программе выложить, чтобы кто-то что-то смог подсказать...
Заранее благодарен за любые соображения по теме! |
|
Георгий |
Отправлено: 30.07.2003, 20:09 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
попробуй обнаружить последовательность действий, после которой, при закрытии, происходит вылет.
потом заремь весь код, а потом отремливай и смотри, когда упадёт.
впринципе похоже на двойной delete или работу с не инициализированным указателем, а может быть variant глючит.
что выкладывать... Клади текст всех .cpp файлы — может кто-нибудь сможет что-то увидеть... Но если код большой (>5000 строк) скорее никто ничего не увидит.
Критические куски (которые нужны конкурентам) советую проверить самому (а то вдруг через пару лет увидишь свою программу, но уже с другими авторами...) |
|
Jean |
Отправлено: 30.07.2003, 21:30 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 34
|
Я бы сказал, что если есть метод Close у чего-нибудь, то именно там происходит ошибка — вот тебе локализация А дальше, давай код этого метода, конкурентам на него пофигу. Бум смотреть. Я сам в данное время работаю с Access под ADO. Так что, можно объединить наши знания
|
|
Георгий |
Отправлено: 30.07.2003, 22:16 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
при работе деструкторов классов полей и базовых может вылетать — а это уже не метод Close.
Да и вообще — это что угодно может быть — в том числе глюк компилятора...
У меня нечто похожее было — добавил в проект очередную форму, а проект стал вылетать с ошибкой доступа к памяти (при закрытии)...
Обнаружил, что если её не открывать, то всё работает нормально.
Заремил весь код этой формы.
Всё равно если её открыть и закрыть, то проект вылетает при закрытии.
Долго парился, даже решил без неё обойтись... но тут помог случай — стал переписывать код одного автономного потока — а там в случае таймаута delete на указатель, а в начале цикла — опять delete на тот же указатель...
Исправил этот двойной delete.
Заработала вторая форма и вылеты прекратились!
Мораль сей басни такова — необязательно изменения несут ошибку — они могут разбудить старую ошибку.
Ждём кода...
мазахисты блин — я в своих старых исправных программах не могу разобраться, а тут чужая, да ещё и не исправная... |
|
Paranoik |
Отправлено: 30.07.2003, 22:58 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 12
|
2 Георгий
Есть некоторая закономерность: на главной форме есть PageControl со страницами. Если прогу запустить и сразу закрыть — всё Ок. Если перелистнуть страницами — ошибки. Но это тоже, кажется, особо ничего не даёт... В одной последовательности перелистнешь — ошибки, в другой — всё ок... При этом никакой обработки на перелистывание страниц я не делал; перелистывание ни на что не влияет...
Ремить очень много. Всё повязано перевязано, код на несколько тысяч строк наберётся.
Эх куда бы выложить-то... А то цитировать уж очень геморно и ненаглядно (ну есесьно я не собираюсь неск. тыщ цитировать, тока работу с формами )
А на конкурентов пофиг... Кому нужна такая программа узкоспециализированная... |
|
Admin |
Отправлено: 30.07.2003, 23:07 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Как куда выложить ?
Так предлагалась же папка для обмена-выкладывания — пользуйтесь !
(23.06.2003) Для участников форума организована папка для обмена примерами или выкладывания информации.
Посмотреть содержимое: http://cbuilder.ru/Upload
Закачать пример в папку: http://cbuilder.ru/Upl/Upload.html
(пароль для закачки — как и для входа в закрытые форумы, см. на форуме "Работа сайта")
Только не забудьте написать здесь, как она там называется !
Отредактировано Admin — 31/07/2003, 00:09
|
|
Jean |
Отправлено: 31.07.2003, 10:35 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 34
|
А зачем такие сложности с паролями, которые и без того выложены на всеобщее обозрение? Почему нельзя так закачивать. Например, по паролю пользователя. Тогда бы Вы смогли установить кто закачивал. И если там мусор, то принимать соответствующие действия.
|
|
Paranoik |
Отправлено: 31.07.2003, 11:26 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 12
|
Пока не решился выкладывать всё файло, в котором черт ногу сломит.
На другом форуме подали идею, что, возможно, имеет место создание с помощью new без соответствующего ему delete.
В программе пришлось использовать чужой пример, до конца не разбираясь, как оно работает и там есть такие места с new.
В общем, я закинул в аплод файл "paranoik-unit10.cpp" (около 6кб).
Там используется (как — с трудом представляю ) некий шаблон для рантайм создания столбцов в таблице TRxMemoryData.
К сожалению важные моменты на тему деструкторов я подзабыл (как всегда — отложил, не успел...), но видимо там (в коде) таки что-то подобное должно присутствовать и его там нет.
Если не сложно — подскажите в чем ошибка и как корректно удалить то, что я там насоздавал?
Отредактировано Paranoik — 31/07/2003, 12:29 |
|
Asher |
Отправлено: 31.07.2003, 12:43 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
QUOTE | имеет место создание с помощью new без соответствующего ему delete. |
А что по этому поводу говорит CodeGuard?
ИМХО такую ситуацию он стабильно ловить обязан
Плюс разрешить все Language Exeption — может место и локализуется
|
|
Георгий |
Отправлено: 01.08.2003, 11:40 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
мне не нравится:
...
new TPPAField(DBData->MemoryTable,"date","даты");
...
while (!DBData->DBQuery->Eof){//СОЗДАЕМ СТОЛБЦЫ ПО СПИСКУ ТОЧЕК
i++;
pName = "p" + IntToStr(i);
new TPPAField(DBData->MemoryTable,pName,DBData->DBQuery->FieldByName("name")->AsString);
DBData->MemoryTable->FieldByName(pName)->Alignment = taCenter;
DBData->DBQuery->Next();
}
а теперь создаём миллионы экземпляров, которые связаны с DBData->MemoryTable, а до этого созданные (в предыдущей интерации) наверное думают, что они единственные... Вот, когда приходит черёд освобождать память, где то что-то, думая, что оно обращается к объекту, читает уже свободную память — вот и GPF в виде "Выполнила ... будет закрыта" |
|
Paranoik |
Отправлено: 01.08.2003, 18:18 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 12
|
2 Георгий
перед началом очередной порции создания столбов вызывается такая хрень:
DBData->MemoryTable->Fields->Clear();
она призвана удалить все существующие на данный момент столбцы в таблице.
Да и всё вроде работает... Думаю, было бы видно, если бы создавались лишние столбцы... Ещё он не даст создать столб с именем уже существующего...
Шаблон, который находится в начале файла, я честно содрал с чужого примера и, кажется, там было что-то вроде деструктора. Тогда у меня на том месте выскакивала ошибка и я просто напросто удалил это дело и забил, убедившись, что вроде б как всё работает. Тон, ясно понятно, плохой, но как всегда время поджимало. |
|
Asher |
Отправлено: 01.08.2003, 19:20 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Значит добавь DBData->MemoryTable->Fields->Clear(); перед выходом из программы
|
|
Paranoik |
Отправлено: 02.08.2003, 17:24 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 12
|
2 Asher
К сожалению не помогло.
Вообще, ошибку удалось скрыть (сообщения при выходе уже не вываливаются), но это всего лишь маскировка.
Хотелось бы разобраться всё-таки, в чем проблема... |
|
Asher |
Отправлено: 04.08.2003, 09:06 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
А все-таки что говорит CodeGuard?
Если это утечка памяти, то он тебе все напишет — кто, где и сколько
(правда под W98 вроде не всегда работает)
|
|