среда, 17 марта 2010 г.

DCLP - Вселенское Зло

с утра посмотрел на останки приложения (поступил развернутый минидамп) - после некоторых усилий мне удалось получить результат.

Программа упала на старте вот на таком фрагменте кода
void TChartCollectionProxy_::CreateEmptyCollection ()
{
if ( ! ptr_CriticalSection )
{
HORUSBASE_Etl_EnterRestrictedSection
if ( ! ptr_CriticalSection )
Killer.SetCriticalSection ( ( ptr_CriticalSection = new ( mem_CriticalSection ) threadsafe_etl::TCriticalSection_ () ) );
HORUSBASE_Etl_LeaveRestrictedSection
}

if (ptr_CollectionSingleton == 0)
{
threadsafe_etl::TCriticalSectionGuard_ guard ( ptr_CriticalSection );
if (ptr_CollectionSingleton == 0)
ptr_CollectionSingleton = new ( & la_Coll ) TChartCollection_ (); //It's too long for a restricted section.
}

{
threadsafe_etl::TCriticalSectionGuard_ guard ( ptr_CriticalSection );
Attach( ptr_CollectionSingleton );
ptr_CollectionSingleton->IncRef(); // <---------------------- падает здесь
}
}


Быстрый взгляд выявил знакомый паттерн DCLP, который все еще встречается, несмотря на то, что уже давно известно о его проблемах, особенно на многоядерных процессорах.

Вот ссылочка, где проблему со всех сторон разжевывают Саттер с Александреску - http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf.

Мне вот интересно - как теперь выявлять такие места, просматривать все эти сотни мегабайт кода пяти-семилетней давности?

По факту, проблема проявляется очень редко, но это не значит, что ей заниматься не нужно...

Комментариев нет: