Программа вылетает не в определённом месте, а непонятно где, точнее вылетает не постоянно, а то вылетает то нет...
Сама программа написана в билдере 6.0. При работе с СодеГуардом, ошибок нет. Покрайней мере не выдаёт никаких сообщений. Программа часто использует динамическую память.
Ещё в программе используется дополнительный поток, создаётся стандартными билдеровскими средствами, через класс TTread. Не может быть такого, что программа вылетает из-за асинхронизации в некоторых случаях работы. Идёт обращение к СОМ-порту, но только из даполнительного потока, главный поток работает только с интерфейсом...
Тестировал долго, на одном и том же месте программа то вылетает то нет....
А вообще были случаи, что в процесе отладки сам билдер выкидывал сообщения о ошибках связаных с использованием потока, но после продолжения работы, программа работала...
При переполнении выделенного буфера в динамической памяти Мастдай приспокойно выделяет следующую страницу, но при этом, он не помечает ее, как связанную, где-то "у себя в бошке". При следующем (нормальном) запросе на выделение памяти он приспокойно пытается выделить ту же страницу и обнаруживает, что она занята: крах. PAGE_FAULT_ERROR
Происходит это, естессно не в момент переполнения, а в любой момент выделения памяти после того.
[C++] Не совсем так22.06.04 12:24 Автор: amirul <Serge> Статус: The Elderman
> При переполнении выделенного буфера в динамической памяти > Мастдай приспокойно выделяет следующую страницу, но при > этом, он не помечает ее, как связанную, где-то "у себя в > бошке". При следующем (нормальном) запросе на выделение > памяти он приспокойно пытается выделить ту же страницу и > обнаруживает, что она занята: крах. PAGE_FAULT_ERROR Мастдай не выделяет, а там находятся управляющие структуры кучи. Если запороть кучу, то продолжать с ней работать можно, а когда происходит следующее обращение, то по указателю в разрушенной куче винда может обратиться куда угодно. И вот тогда то слетает по #PF.
> Происходит это, естессно не в момент переполнения, а в > любой момент выделения памяти после того.
А откуда такие сведения о личной жизни виндов?)22.06.04 04:23 Автор: Killer{R} <Dmitry> Статус: Elderman
> При переполнении выделенного буфера в динамической памяти > Мастдай приспокойно выделяет следующую страницу, но при > этом, он не помечает ее, как связанную, где-то "у себя в > бошке". При следующем (нормальном) запросе на выделение > памяти он приспокойно пытается выделить ту же страницу и > обнаруживает, что она занята: крах. PAGE_FAULT_ERROR > Происходит это, естессно не в момент переполнения, а в > любой момент выделения памяти после того.
А как же Access violation'ы всяческие при обращении к левым адресам? А насчет вылета "молча" то полагаю у автора поста либо чтото с синхронизацией не в порядке либо проблемы с обращением к структурам не выделяемым в динамической памяти (запись 1000 байт в char[999] например Ж)).
Кстати еще - это там случайно не библиотека писанная на билдере и вызываемая из другой программы из потоков? В этом случае надо написать в начале функции DllMain: IsMultiThread=true;
Может в синхронизации проблемма и заключается...22.06.04 08:27 Автор: CrazyPitbull Статус: Незарегистрированный пользователь
> А как же Access violation'ы всяческие при обращении к левым > адресам? А насчет вылета "молча" то полагаю у автора поста > либо чтото с синхронизацией не в порядке либо проблемы с > обращением к структурам не выделяемым в динамической памяти > (запись 1000 байт в char[999] например Ж)). > > Кстати еще - это там случайно не библиотека писанная на > билдере и вызываемая из другой программы из потоков? В этом > случае надо написать в начале функции DllMain: > IsMultiThread=true;
Библиотек нету...
И к структурам с невыделеной памятью тоже не обращается, так бы CodeGuard выдал сообщение о неверном обращении...
Допускаю, что проблемма в синхронизации, но как тогда это отследить, убедиться в этом на все 100% ?
Дык, с какой ошибкой вылетает-то?23.06.04 04:50 Автор: Zef <Alloo Zef> Статус: Elderman
> Библиотек нету... > И к структурам с невыделеной памятью тоже не обращается, > так бы CodeGuard выдал сообщение о неверном обращении... > Допускаю, что проблемма в синхронизации, но как тогда это > отследить, убедиться в этом на все 100% ? CodeGuard не скажет тебе если у тя в ReadFile каком нить за буфер вылезет. Потому что он только Сшные функции отслеживает (memcpy там всякие). Про АПИ он ниче не знает потому некорректные обращения в АПИ просто не заметит.
посмотри дебагером например SofIce21.06.04 21:57 Автор: choor Статус: Elderman
Потому как проблемы скорее всего в рассинхронизации потоков.
Лучше загрузить сайс и дождаться фаулта - винда сразу вывалится в сайс. После этого смотреть на состояние программы (стек, переменные и пр).
А еще лучше наставить OutputDebugString-ов с выводом всей более-менее серьезной инфы (вход/выход в функции, передаваемые параметры, возвращаемые значения, вывод в контрольных точках), причем особое внимание уделять состоянию указателей. Далее по полученному логу можно довольно точно восстановить причину краха.
Пошаговый трейс работает нормально22.06.04 13:41 Автор: CrazyPitbull Статус: Незарегистрированный пользователь
Программа не вываливается при пошаговом трейсинге. Более того вываливается в процессе некоторой работы, причём ситуация вроде нормально обрабатывается (при пошаговом трейсинге всё работает как надо), но иногда происходит вылет...
Вот я и говорю, делай дебаг-лог22.06.04 14:26 Автор: amirul <Serge> Статус: The Elderman