как найти выделение большого статического массива?
От: _Winnie Россия C++.freerun
Дата: 10.11.04 10:14
Оценка: :))) :))
есть проект из 1000 файлов.
Какая-то падла завела статический массив размеров в 400 мегабайт (Программа занимает при старте WinMainCRTStartup 400 метров. Память выделяется загрузчиком Windows)
Неизвестно где.
Как найти?
Правильно работающая программа — просто частный случай Undefined Behavior
Re: как найти выделение большого статического массива?
От: _nn_  
Дата: 10.11.04 10:46
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>есть проект из 1000 файлов.

_W>Какая-то падла завела статический массив размеров в 400 мегабайт (Программа занимает при старте WinMainCRTStartup 400 метров. Память выделяется загрузчиком Windows)
_W>Неизвестно где.
_W>Как найти?

Может сделать поиск в файлах на строку "400000000" ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: как найти выделение большого статического массива?
От: Аноним  
Дата: 10.11.04 10:50
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>есть проект из 1000 файлов.

_W>Какая-то падла завела статический массив размеров в 400 мегабайт (Программа занимает при старте WinMainCRTStartup 400 метров. Память выделяется загрузчиком Windows)
_W>Неизвестно где.
_W>Как найти?



И давно так?
Если не так давно, и файлы хранятся под какой-нибудь системой управления версий,
то можно посмотреть по последним check in файлов на сервер...

Ну а так может помочь поиск по ключевым словам static.
Поиск по регурярному выражению должен отсечь ненужные варианты.
например так static.*\[
Re: как найти выделение большого статического массива?
От: aka50 Россия  
Дата: 10.11.04 10:51
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>есть проект из 1000 файлов.

_W>Какая-то падла завела статический массив размеров в 400 мегабайт (Программа занимает при старте WinMainCRTStartup 400 метров. Память выделяется загрузчиком Windows)
_W>Неизвестно где.
_W>Как найти?

смотреть BSS секцию в бинаре... objdump-ом... или как он под виндой зовется...
Re[2]: как найти выделение большого статического массива?
От: ssm Россия  
Дата: 10.11.04 10:55
Оценка:
Здравствуйте, _nn_, Вы писали:



__>Может сделать поиск в файлах на строку "400000000" ?


тогда уж на "419430400"
Re[3]: как найти выделение большого статического массива?
От: aka50 Россия  
Дата: 10.11.04 11:03
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, _nn_, Вы писали:




__>>Может сделать поиск в файлах на строку "400000000" ?


ssm>тогда уж на "419430400"


если уж более точно , то можно поискать
"#define.*4\d{8,8}$"
"const.*4\d{8,8}$"
"\[.*4\d{8,8}$"
Re: как найти выделение большого статического массива?
От: 0xDEADBEEF Ниоткуда  
Дата: 10.11.04 13:55
Оценка: 2 (1) :)
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]: как найти выделение большого статического массива?
От: Maslex  
Дата: 10.11.04 14:27
Оценка:
Здравствуйте, 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]: как найти выделение большого статического массива?
От: 0xDEADBEEF Ниоткуда  
Дата: 10.11.04 16:34
Оценка: 1 (1) :)
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% уверен что это займет времени еще больше.

Вот к примеру как выглядит мап для следующего кода:
#include <stdio.h>

char JUNK[400* 1024 * 1024];

int main()
{
 *JUNK = 0;
 printf("Hello, world!\n");
}


 Timestamp is 41924108 (Wed Nov 10 18:25:44 2004)

 Preferred load address is 00400000

 Start         Length     Name                   Class
 0001:00000000 00004f38H .text                   CODE
 0002:00000000 000000d4H .idata$5                DATA
 0003:0000002c 00000004H .CRT$XTA                DATA
 0003:00000030 00000004H .CRT$XTZ                DATA
 0003:00000040 00000680H .data                   DATA
 0003:000006c0 190015c8H .bss                    DATA <--вот где живет этот гад!

  Address         Publics by Value              Rva+Base     Lib:Object

 0000:00000000       __except_list              00000000     <absolute>
 0000:00000002       ___safe_se_handler_count   00000002     <absolute>
 0001:00000000       _main                      00401000 f   junk.obj
 .......
 0003:00000724       __C_Exit_Done              00408724     LIBC:crt0dat.obj
 0003:00000728       __adbgmsg                  00408728     LIBC:crt0msg.obj
 0003:0000072c       __pxcptinfoptrs            0040872c     LIBC:winxfltr.obj
 0003:000008a4       ?_pnhHeap@@3P6AHI@ZA       004088a4     LIBC:handler.obj
 0003:000008a8       __newmode                  004088a8     LIBC:_newmode.obj
 0003:000008ac       ___lc_handle               004088ac     LIBC:nlsdata2.obj
 0003:000008c4       ___lc_codepage             004088c4     LIBC:nlsdata2.obj
 0003:000008c8       ___lc_collate_cp           004088c8     LIBC:nlsdata2.obj
 0003:000008e0       _JUNK                      004088e0     <common> <-- вот он
 0003:190008e0       ___sbh_pHeaderDefer        194088e0     <common> <-- заметьте как подрасли адреса после него
 0003:190008e4       ___sbh_cntHeaderList       194088e4     <common>
 0003:190008e8       ___sbh_pHeaderList         194088e8     <common>
 0003:190008ec       ___sbh_threshold           194088ec     <common>
 0003:190008f0       ___sbh_pHeaderScan         194088f0     <common>
Posted via RSDN NNTP Server 1.9 gamma
__________
16.There is no cause so right that one cannot find a fool following it.
Re[4]: как найти выделение большого статического массива?
От: Maslex  
Дата: 11.11.04 08:55
Оценка:
Здравствуйте, 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
static char szTest[30000000] = "Test String";

содержимое файла — test.cpp
#include "stdafx.h"
#include "test.h"
#include "string.h"

extern void test1();
int main(int argc, char* argv[])
{
   strcpy(szTest, "SomeString");
   printf("szTest in test.cpp = %s\n", szTest);
   test1();
    return 0;
}

содержимое файла — test1.cpp
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: как найти выделение большого статического массива?
От: SMSM  
Дата: 12.11.04 12:30
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>есть проект из 1000 файлов.

_W>Какая-то падла завела статический массив размеров в 400 мегабайт (Программа занимает при старте WinMainCRTStartup 400 метров. Память выделяется загрузчиком Windows)
_W>Неизвестно где.
_W>Как найти?

Подобные штуки иногда специально делают, если программа работает с собственным внутренним менеджером памяти.
Поищи его в текстах (обычно это выделенный класс или файл) и посмотри инициализацию.
Может быть, поможет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.