есть проект из 1000 файлов.
Какая-то падла завела статический массив размеров в 400 мегабайт (Программа занимает при старте WinMainCRTStartup 400 метров. Память выделяется загрузчиком Windows)
Неизвестно где.
Как найти?
Правильно работающая программа — просто частный случай Undefined Behavior
Re: как найти выделение большого статического массива?
Здравствуйте, _Winnie, Вы писали:
_W>есть проект из 1000 файлов. _W>Какая-то падла завела статический массив размеров в 400 мегабайт (Программа занимает при старте WinMainCRTStartup 400 метров. Память выделяется загрузчиком Windows) _W>Неизвестно где. _W>Как найти?
Может сделать поиск в файлах на строку "400000000" ?
Re: как найти выделение большого статического массива?
От:
Аноним
Дата:
10.11.04 10:50
Оценка:
Здравствуйте, _Winnie, Вы писали:
_W>есть проект из 1000 файлов. _W>Какая-то падла завела статический массив размеров в 400 мегабайт (Программа занимает при старте WinMainCRTStartup 400 метров. Память выделяется загрузчиком Windows) _W>Неизвестно где. _W>Как найти?
И давно так?
Если не так давно, и файлы хранятся под какой-нибудь системой управления версий,
то можно посмотреть по последним check in файлов на сервер...
Ну а так может помочь поиск по ключевым словам static.
Поиск по регурярному выражению должен отсечь ненужные варианты.
например так static.*\[
Re: как найти выделение большого статического массива?
Здравствуйте, _Winnie, Вы писали:
_W>есть проект из 1000 файлов. _W>Какая-то падла завела статический массив размеров в 400 мегабайт (Программа занимает при старте WinMainCRTStartup 400 метров. Память выделяется загрузчиком Windows) _W>Неизвестно где. _W>Как найти?
смотреть BSS секцию в бинаре... objdump-ом... или как он под виндой зовется...
Re[2]: как найти выделение большого статического массива?
Hello, _Winnie!
W> Как найти?
— при линковке сказать чтобы генерился map-файл. (для VC опция /MAP)
— по этому map-файлу найти обьект с ненормально большим размером и уконтрапупить его.
— затем уконтрапупить идиота кторый это сделал.
Posted via RSDN NNTP Server 1.9 gamma
__________
16.There is no cause so right that one cannot find a fool following it.
Re[2]: как найти выделение большого статического массива?
Здравствуйте, 0xDEADBEEF, Вы писали:
DEA>Hello, _Winnie!
W>> Как найти? DEA>- при линковке сказать чтобы генерился map-файл. (для VC опция /MAP) DEA>- по этому map-файлу найти обьект с ненормально большим размером и уконтрапупить его. DEA>- затем уконтрапупить идиота кторый это сделал.
Хороший вариант, сам когда-то искал похожее счастье таким образом, но потом понял что это не всегда работает.
Если массив был объявлен в хедере, то сами понимаете что из этого будет
Особенно если этот хедерок включается в разные cpp-шники ну и т.д.
ИМХО: проще, а главное надежнее просмотреть код.
... << RSDN@Home 1.1.4 beta 3 rev. 229>>
WBR,
Maslex
Re[3]: как найти выделение большого статического массива?
Hello, Maslex!
You wrote on Wed, 10 Nov 2004 14:27:44 GMT:
W>>> Как найти? M> Хороший вариант, сам когда-то искал похожее счастье таким образом, но M> потом понял что это не всегда работает.
И еще, MAP-файл как минимум позволяет посмотреть какая секция пухнет (наиболее вероятно что это BSS, но чем черт не шутит).
M> Если массив был объявлен в хедере, то сами понимаете что из этого будет M> Особенно если этот хедерок включается в разные cpp-шники ну и т.д.
Не-а.
Если этот массив включается во множество cpp, то линкер бы обиделся на то что
какой-то символ определен во множестве .obj-файлов и проблема решилась бы сама собой.
Разве что ваш идиот этому дал этому массиву спецификатор __declspec(selectany),
но тогда это не идиот, а самый натуральный враг народа.
M> ИМХО: проще, а главное надежнее просмотреть код.
Удачи в этом безнадежном деле...
100% уверен что это займет времени еще больше.
Вот к примеру как выглядит мап для следующего кода:
Здравствуйте, 0xDEADBEEF, Вы писали:
DEA>Hello, Maslex! DEA>You wrote on Wed, 10 Nov 2004 14:27:44 GMT:
W>>>> Как найти? M>> Хороший вариант, сам когда-то искал похожее счастье таким образом, но M>> потом понял что это не всегда работает. DEA>И еще, MAP-файл как минимум позволяет посмотреть какая секция пухнет (наиболее вероятно что это BSS, но чем черт не шутит).
С этим согласен.
M>> Если массив был объявлен в хедере, то сами понимаете что из этого будет M>> Особенно если этот хедерок включается в разные cpp-шники ну и т.д. DEA>Не-а. DEA>Если этот массив включается во множество cpp, то линкер бы обиделся на то что DEA>какой-то символ определен во множестве .obj-файлов и проблема решилась бы сама собой. DEA>Разве что ваш идиот этому дал этому массиву спецификатор __declspec(selectany), DEA>но тогда это не идиот, а самый натуральный враг народа.
Ничего подобного никуда он не обидется, если массив static то он будет в каждой единице трансляции.
Вот тебе пример:
содержимое файла — test.h
void test1()
{
printf("szTest in test1.cpp = %s\n", szTest);
}
Откомпилируй и посмотри сколько будет szTest и какой будет размерчик exe-шника ?
Вот вывод этой сложнейшей программы:
szTest in test.cpp = SomeString
szTest in test1.cpp = Test String
M>> ИМХО: проще, а главное надежнее просмотреть код. DEA>Удачи в этом безнадежном деле... DEA>100% уверен что это займет времени еще больше.
А удачи не мне нужно желать, а автору темы
Да по MAP-y и по размеру .obj файлов можно примерно определить возможных кандидатов, но не более того.
И вовсе не обязательно что эти 400 Mb идут одним куском. Оно может быть размазано по куче файлов, везде по кусочку.
Так что только просмотривать код.
... << RSDN@Home 1.1.4 beta 3 rev. 229>>
WBR,
Maslex
Re: как найти выделение большого статического массива?
Здравствуйте, _Winnie, Вы писали:
_W>есть проект из 1000 файлов. _W>Какая-то падла завела статический массив размеров в 400 мегабайт (Программа занимает при старте WinMainCRTStartup 400 метров. Память выделяется загрузчиком Windows) _W>Неизвестно где. _W>Как найти?
Подобные штуки иногда специально делают, если программа работает с собственным внутренним менеджером памяти.
Поищи его в текстах (обычно это выделенный класс или файл) и посмотри инициализацию.
Может быть, поможет.