C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Помогите выявить ошибку, или хотя бы спрятать её проявление
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 у чего-нибудь, то именно там происходит ошибка — вот тебе локализация smile.gif А дальше, давай код этого метода, конкурентам на него пофигу. Бум смотреть. Я сам в данное время работаю с Access под ADO. Так что, можно объединить наши знания smile.gif
Георгий
Отправлено: 30.07.2003, 22:16


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



при работе деструкторов классов полей и базовых может вылетать — а это уже не метод Close.
Да и вообще — это что угодно может быть — в том числе глюк компилятора...
У меня нечто похожее было — добавил в проект очередную форму, а проект стал вылетать с ошибкой доступа к памяти (при закрытии)...
Обнаружил, что если её не открывать, то всё работает нормально.
Заремил весь код этой формы.
Всё равно если её открыть и закрыть, то проект вылетает при закрытии.
Долго парился, даже решил без неё обойтись... но тут помог случай — стал переписывать код одного автономного потока — а там в случае таймаута delete на указатель, а в начале цикла — опять delete на тот же указатель...
Исправил этот двойной delete.
Заработала вторая форма и вылеты прекратились!
Мораль сей басни такова — необязательно изменения несут ошибку — они могут разбудить старую ошибку.

Ждём кода...
мазахисты блин — я в своих старых исправных программах не могу разобраться, а тут чужая, да ещё и не исправная...
Paranoik
Отправлено: 30.07.2003, 22:58


Ученик-кочегар

Группа: Участник
Сообщений: 12



2 Георгий
Есть некоторая закономерность: на главной форме есть PageControl со страницами. Если прогу запустить и сразу закрыть — всё Ок. Если перелистнуть страницами — ошибки. Но это тоже, кажется, особо ничего не даёт... В одной последовательности перелистнешь — ошибки, в другой — всё ок... При этом никакой обработки на перелистывание страниц я не делал; перелистывание ни на что не влияет...

Ремить очень много. Всё повязано перевязано, код на несколько тысяч строк наберётся.

Эх куда бы выложить-то... А то цитировать уж очень геморно и ненаглядно (ну есесьно я не собираюсь неск. тыщ цитировать, тока работу с формами smile.gif)


А на конкурентов пофиг... Кому нужна такая программа узкоспециализированная...
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кб).
Там используется (как — с трудом представляю smile.gif) некий шаблон для рантайм создания столбцов в таблице 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 вроде не всегда работает)

Вернуться в Вопросы программирования в C++Builder