powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Неадекватный дамп
11 сообщений из 36, страница 2 из 2
Неадекватный дамп
    #39476804
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devТы не понял моего намёка на барьеры памяти. Используешь boost для обеспечения атомарности при работе с данными в разделяемой между потоками памяти?
Намек я понял, но не использую ни boost, ни std::shared_ptr, у меня свое казино с блэкджеком и путанами :)

Я не оценил необходимости в данных библиотеках и классах, но есть схожие механизмы, которые работают не хуже. Баг нужно локализовать и исправить и все будет работать нормально, закидывать место exception'ами или закручиванием в разделяемый ресурс с подсчетом ссылок в данном случае равносильно сокрытию более суровых багов, так что, пока, кроме механизма распараллеливания и сбора данных от потоков, все устраивает.
...
Рейтинг: 0 / 0
Неадекватный дамп
    #39476807
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)адекватный у тебя стэк - не ищи того чего нет, как раз вызовы виртуальных функций на удалённом и выделенном объекте, слова ниже это подтверждают
ну и замечательно :),
будем двигаться дальше
...
Рейтинг: 0 / 0
Неадекватный дамп
    #39476811
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumkealon(Ruslan)адекватный у тебя стэк - не ищи того чего нет, как раз вызовы виртуальных функций на удалённом и выделенном объекте, слова ниже это подтверждают
ну и замечательно :),
будем двигаться дальше
такое ловится переопределением New и Delete, т.е. по сути пишешь свою надстройку над менеджером памяти

в New выделяешь блоками кратными размеру страницы
в Delete не освобождаешь память, а ставишь на её страницы протекцию No_ACCESS
ошибки доступа и выведут к твоей баге
...
Рейтинг: 0 / 0
Неадекватный дамп
    #39476842
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumrdb_devТы не понял моего намёка на барьеры памяти. Используешь boost для обеспечения атомарности при работе с данными в разделяемой между потоками памяти?
Намек я понял, но не использую ни boost, ни std::shared_ptr, у меня свое казино с блэкджеком и путанами :)

Я не оценил необходимости в данных библиотеках и классах, но есть схожие механизмы, которые работают не хуже. Баг нужно локализовать и исправить и все будет работать нормально, закидывать место exception'ами или закручиванием в разделяемый ресурс с подсчетом ссылок в данном случае равносильно сокрытию более суровых багов, так что, пока, кроме механизма распараллеливания и сбора данных от потоков, все устраивает.Возражений нет! У меня тоже своя "библиотека" в заголовочных файлах c++ - с inline функциями, реализующими на GNU ассемблере работу с командами lock;cmpxchg, mfence, lfence, sfence и пр.
...
Рейтинг: 0 / 0
Неадекватный дамп
    #39476989
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Double-freeing почти всегда вызван классом, в котором хранится указатель на объект удаляемый в деструкторе, но при этом отсутствует корректный конструктор копирования, а берется генерируемый компилятором, который просто копирует указатель вместо клонирования (или запрещения копирования воообще).
В итоге в двух копиях указатель одинаковый и при их удалении на втором будет краш (если споймается).

А копирование например может неявно происходить при вызове функции передачей по значению.
...
Рейтинг: 0 / 0
Неадекватный дамп
    #39476993
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, то что удалось достичь 100% повторяемости, говорит о том что речь не о гонках из-за многопоточности.
А это дополнительно повышает вероятность того что проблема вызвана конструктором копирования.
...
Рейтинг: 0 / 0
Неадекватный дамп
    #39476995
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, ценный опыт!...
...
Рейтинг: 0 / 0
Неадекватный дамп
    #39477005
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКстати, то что удалось достичь 100% повторяемости, говорит о том что речь не о гонках из-за многопоточности.
А это дополнительно повышает вероятность того что проблема вызвана конструктором копирования.

Увы, не мой случай


За долгое время работы я уже выработал привычку принудительно запрещать подобное во всех своих классах, в которых мне такое поведение не нужно, объявляя конструктор как private.

Причину проблемы я установил, и она заключается в том, что в очень редких случаях (отсюда и долговременность работы приложения и хаотичность падений) в классе пула потоков происходит следующая ситуация: клиент создает массив запросов CPoolTask и помещает их на обработку в пул потоков (QueryFarm), пул создает необходимые потоки или пробуждает простаивающие и приступает к обработке новых заданий. Потоки, которыми управляет пул, если для них нет работы в течение длительного времени, могут запросить у пула подтверждение на завершение своей работы, и пул, в зависимости от его настройки, может им это разрешить. Когда пул разрешает объекту потока завершить себя, тот вычищает свою память, включая хранимое в нем задание CPoolTask, если таковое имеется и клиент (!), поставивший это задание на обработку, тоже не против такого поведения. Я настроил пул так, чтобы он не чистил задания автоматически, но как оказалось не везде: выход потока по таймауту я не предвидел.

Пул разрешил потоку завершить себя, а раз клиент тоже не отреагировал на запрос об удаление объекта CPoolTask, то поток добросовестно прихватил и его. Это тот самый первый раз, когда объект задания удален правильно, с точки зрения кучи, но об этом ничего не известно в классе клиента, который это задание туда назначал. Поэтому когда приходит момент почистить задания на клиенте я и получаю double-free.
...
Рейтинг: 0 / 0
Неадекватный дамп
    #39477006
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, то есть достаточно запретить копирование в базовом классе, как ТС сразу найдёт место, откуда растут ноги?
...
Рейтинг: 0 / 0
Неадекватный дамп
    #39477076
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumПул разрешил потоку завершить себя, а раз клиент тоже не отреагировал на запрос об удаление объекта CPoolTask, то поток добросовестно прихватил и его. Это тот самый первый раз, когда объект задания удален правильно, с точки зрения кучи, но об этом ничего не известно в классе клиента, который это задание туда назначал. Поэтому когда приходит момент почистить задания на клиенте я и получаю double-free.
Если у вас объект одновременно используется в нескольких местах, то используйте shared_ptr и не морочьте себе голову всякими разрешениями на удаление.


egorychAnatoly Moskovsky, то есть достаточно запретить копирование в базовом классе, как ТС сразу найдёт место, откуда растут ноги?
Да. Если причина в этом.
...
Рейтинг: 0 / 0
Неадекватный дамп
    #39477090
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЕсли у вас объект одновременно используется в нескольких местах, то используйте shared_ptr и не морочьте себе голову всякими разрешениями на удаление.
возможно, что и буду, но, если бы я его использовал, то никогда бы не понял, что возможна такая ситуация:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
if (::WaitForSingleObject(hEvent, dwTimeOut) == WAIT_TIMEOUT)
{
	if (::WaitForSingleObject(hEvent, 0UL) == WAIT_OBJECT_0)
	{
	// тоже TRUE !!
	//
	// таймаут и сигнал о поставленном в очередь задании пришли ноздря в ноздрю, но система сначала
 	// отреагировала на таймаут, если потоку разрешено завершить работу назначенное задание никогда
	// НЕ будет выполнено, что может привести к другим более плачевным последствиям, если от 
	// выполнения задания зависит код, который ожидает его завершения
	}
}


не знаю сколько бы времени я еще угрохал на то, чтобы понять почему у меня запросы зависают и не обрабатываются :), а так найден логический баг, который можно поправить
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Неадекватный дамп
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]