Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
Вот я и говорю, делай дебаг-лог 22.06.04 14:26 Число просмотров: 1389
Автор: amirul <Serge> Статус: The Elderman
|
Чем подробнее, тем легче будет выловить ошибку.
Анализ переменных в точке вылета тоже иногда помогает, но не всегда понятно почему к примеру в данном конкретном указателе сейчас содержится мусор
|
<programming>
|
[C++] Программа вылетает, но не разберусь из-за чего... 21.06.04 20:26
Автор: CrazyPitbull Статус: Незарегистрированный пользователь
|
Программа вылетает не в определённом месте, а непонятно где, точнее вылетает не постоянно, а то вылетает то нет...
Сама программа написана в билдере 6.0. При работе с СодеГуардом, ошибок нет. Покрайней мере не выдаёт никаких сообщений. Программа часто использует динамическую память.
Ещё в программе используется дополнительный поток, создаётся стандартными билдеровскими средствами, через класс TTread. Не может быть такого, что программа вылетает из-за асинхронизации в некоторых случаях работы. Идёт обращение к СОМ-порту, но только из даполнительного потока, главный поток работает только с интерфейсом...
Тестировал долго, на одном и том же месте программа то вылетает то нет....
А вообще были случаи, что в процесе отладки сам билдер выкидывал сообщения о ошибках связаных с использованием потока, но после продолжения работы, программа работала...
|
|
[C++] Страничное нарушение. 22.06.04 03:39
Автор: Zef <Alloo Zef> Статус: Elderman
|
При переполнении выделенного буфера в динамической памяти Мастдай приспокойно выделяет следующую страницу, но при этом, он не помечает ее, как связанную, где-то "у себя в бошке". При следующем (нормальном) запросе на выделение памяти он приспокойно пытается выделить ту же страницу и обнаруживает, что она занята: крах. 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 не скажет тебе если у тя в ReadFile каком нить за... 22.06.04 14:35
Автор: Killer{R} <Dmitry> Статус: Elderman
|
> Библиотек нету... > И к структурам с невыделеной памятью тоже не обращается, > так бы CodeGuard выдал сообщение о неверном обращении... > Допускаю, что проблемма в синхронизации, но как тогда это > отследить, убедиться в этом на все 100% ? CodeGuard не скажет тебе если у тя в ReadFile каком нить за буфер вылезет. Потому что он только Сшные функции отслеживает (memcpy там всякие). Про АПИ он ниче не знает потому некорректные обращения в АПИ просто не заметит.
|
|
посмотри дебагером например SofIce 21.06.04 21:57
Автор: choor Статус: Elderman
|
Изначально загрузи SymbolLoader'ом
Сделай трейс по шагу и увидишь как и что у тебя происходит, на каком моменте что вылетает.
P.S. следи за регистрами
|
| |
Думаю пошаговый трейс будет работать нормально 22.06.04 12:28
Автор: amirul <Serge> Статус: The Elderman
|
Потому как проблемы скорее всего в рассинхронизации потоков.
Лучше загрузить сайс и дождаться фаулта - винда сразу вывалится в сайс. После этого смотреть на состояние программы (стек, переменные и пр).
А еще лучше наставить OutputDebugString-ов с выводом всей более-менее серьезной инфы (вход/выход в функции, передаваемые параметры, возвращаемые значения, вывод в контрольных точках), причем особое внимание уделять состоянию указателей. Далее по полученному логу можно довольно точно восстановить причину краха.
|
| | |
Пошаговый трейс работает нормально 22.06.04 13:41
Автор: CrazyPitbull Статус: Незарегистрированный пользователь
|
Программа не вываливается при пошаговом трейсинге. Более того вываливается в процессе некоторой работы, причём ситуация вроде нормально обрабатывается (при пошаговом трейсинге всё работает как надо), но иногда происходит вылет...
|
| | | |
Вот я и говорю, делай дебаг-лог 22.06.04 14:26
Автор: amirul <Serge> Статус: The Elderman
|
Чем подробнее, тем легче будет выловить ошибку.
Анализ переменных в точке вылета тоже иногда помогает, но не всегда понятно почему к примеру в данном конкретном указателе сейчас содержится мусор
|
|
Почему исходник никто не показывает... 21.06.04 21:08
Автор: zonny <Sasha> Статус: Member
|
исправь сабж
|
| |
Тык их много... 22.06.04 00:22
Автор: CrazyPitbull Статус: Незарегистрированный пользователь
|
|
|
|