Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

NamedPipe и отжор памяти   Найти похожие ветки 

 
Alkid ©   (2005-12-01 13:49) [0]

Вопрос высокоучёному сообществу: организуется связь между двумя компьютерами путём NamedPipe. Сервер создаёт у себя пайп, а клиент открывает его как файл. Если сервер недоступен, то клиент циклически пытается его открывать.

При всём при это наблюдается интерсное явление: если в ДРУГОМ процессе (наприер IE, WinCommander, etc.) делать что-то с сетью (лазить по локалке, шариться по интернету), то начинается резкий и дикий отжор памяти в КЛИЕНТСКОМ приложении.

Если не шариться по сети, то утечек памяти не наблюдается.

Вопрос: кто-нибудь сталкивался с чем-нибудь подобным и вообще, какие мысли есть у высокоучёного сообщества?


 
Lamer@fools.ua ©   (2005-12-01 14:51) [1]

> какие мысли есть у высокоучёного сообщества?

IMHO, мысли появятся не раньше, чем появится исходный код.


 
Alkid ©   (2005-12-01 14:56) [2]

Вот код, который производит открытие пайпа. Он выдран из
одной процедуры, которая крутится в специальном потоке.

FIP - поле, содержащее IP-адрес сервера


begin
 pipename := "\\" + FIP + "\pipe\SMI2SERVER";
 FPipe := CreateFile(
            PChar(pipename),   // pipe name
            GENERIC_READ or GENERIC_WRITE,
            0,              // no sharing
            Nil,           // no security attributes
            OPEN_EXISTING,  // opens existing pipe
            0,              // default attributes
            0);          // no template file

 if(FPipe = INVALID_HANDLE_VALUE) then
   begin
  sleep(10000);
     exit;
   end
 else
   begin
     dwMode     := PIPE_READMODE_MESSAGE or PIPE_NOWAIT;
     SetNamedPipeHandleState(FPipe,dwMode,nil,nil);
     FConnState := CS_Connected;
   end;
end;


 
Digitman ©   (2005-12-01 16:20) [3]


> Вот код, который производит открытие пайпа


и это ВСЁ, что делает клиентское приложение ?

нахрен такое нужно, спрашивается  ?)


 
Alkid ©   (2005-12-01 16:48) [4]


> и это ВСЁ, что делает клиентское приложение ?
>
> нахрен такое нужно, спрашивается  ?)

Нет, не всё. Но когда мы искали утечку памяти, то методом "дихотомического обрезания кода" :) выяснили, что там сама утечка происходит если работает только вот этот код. Постить сюда ВСЮ программу я не буду (большая) и не могу (секретность - это не шутки).


 
Digitman ©   (2005-12-01 16:54) [5]

дурь это "дихотомическая", скажу я тебе.

если в ходе работы приложения этот код выполнился один-единственный раз, и кроме этого кода вплоть до завершения процесса никакой иной код явно не вызывается и не выполняетя, то никаких утечек памяти быть не может.

а вырвать и привести сюда этот код из контекста неизвестно какого обработчика неизвестно какого события - не велика "дихотомическая премудрость", скажу тебе ... посему думай головой


 
Джо ©   (2005-12-01 17:02) [6]

Отжор памяти - это в смысле утечка (забираем, но не отдаем)? Пробовал с альтернативными менеджерами памяти гонять? Например, MemCheck.pas (http://v.mahon.free.fr/pro/freeware/memcheck).


 
Alkid ©   (2005-12-01 17:06) [7]


> дурь это "дихотомическая", скажу я тебе.

Нет, не дурь. Если код вызывает утечки памяти без отстального кода программы, значит он содержит ошибку в себе, и она не является результатам хитрого взаимодействия разных компонентов программы.
И контекст тут ни при чём. И обработчиком чего-либо оно не является, ибо, как я уже сказал, этот код крутится в отдельном потоке и вызывается не один раз. Если сервер недоступен, то он вызывается периодически, внимательнее читай мой первый пост.

Здесь речь идёт именно о том, напортачил ли я что-то в самом процессе открытия пайпа как файла или это особенности реализации именованных каналов в виндовс вообще или в Win2000 PRO SP4 в частности.


 
Alkid ©   (2005-12-01 17:11) [8]


> Отжор памяти - это в смысле утечка (забираем, но не отдаем)?
>  Пробовал с альтернативными менеджерами памяти гонять? Например,
>  MemCheck.pas

Да, пробовал я MemCheck, только он делает программу неработоспособной. Лезет ошибка. Вроде сделал всё, как написано в инструкции. Кроме того, когда понял, что надо искать вручную, стал жёстко отсекать все части программы, где есть размещение памяти и дошёл до того, что этот отрывок когда даёт прирост памяти, причём строго при наличии сетевой активности у ДРУГОГО процесса. Этот факт меня и смутил.


 
Digitman ©   (2005-12-01 17:12) [9]


> вызывается не один раз


вот именно.

и где у тебя там закрывается хэндл трубы в случае успешного его получения - это страшная буратинская тайна.


 
Игорь Шевченко ©   (2005-12-01 17:12) [10]


> или это особенности реализации именованных каналов в виндовс
> вообще или в Win2000 PRO SP4 в частности.


Это вряд ли. Пардон, немалая часть Windows построена на именованых каналах (свясь с сервисами и т.д.), поэтому в реализации самих каналов все хорошо. Скорее, некоторая особенность есть в реализации конкретной программы. Я бы попробовал посмотреть в сторону Process Explorer c www.sysinternals.com, оно много всего интересного про конкретный процесс рассказывает.


 
Alkid ©   (2005-12-01 17:19) [11]


> вот именно.
>
> и где у тебя там закрывается хэндл трубы в случае успешного
> его получения - это страшная буратинская тайна.

А кто сказал, что во время этого теста есть успешное получение хэндла? Тест проходит специально при отсутсвии сервера как класса (указывается несуществующий ip). Так что закрытия хэндла в тесте нету, и это не есть страшная буратинская тайна :)


 
Alkid ©   (2005-12-01 17:20) [12]


> Это вряд ли. Пардон, немалая часть Windows построена на
> именованых каналах (свясь с сервисами и т.д.), поэтому в
> реализации самих каналов все хорошо. Скорее, некоторая особенность
> есть в реализации конкретной программы. Я бы попробовал
> посмотреть в сторону Process Explorer c www.sysinternals.
> com, оно много всего интересного про конкретный процесс
> рассказывает.

Спасибо, гляну туда.


 
Digitman ©   (2005-12-01 17:37) [13]

а что за блажь - ожидать доступности экз-ра пайпа комбинацией CreateFile+sleep ? причем - в рамках алгоритма, в задачи которого явно не входит какое-то бестолковое ожидание у моря погоды после отказа в коннекте ?

WaitNamedPipe со встроенным механизмом таймаута уже упразднили ?


 
ANB ©   (2005-12-01 17:38) [14]


> Alkid ©   (01.12.05 17:20) [12]

А попробовать покрутить этот код в основном потоке в цикле ?


 
Alkid ©   (2005-12-01 17:41) [15]


> А попробовать покрутить этот код в основном потоке в цикле
> ?

Ты угадал мой следующий шаг в этом направлении. Просто вообще всё это живёт в DLL-ке, которая ко всем её недостаткам ещё и COM :-)
Сейчас я готовлю тестбед конкретно для неё.


 
ANB ©   (2005-12-01 17:49) [16]


> Alkid ©   (01.12.05 17:41) [15]

Выдернуть из DLL, сделать тестовое приложение и проверить, чего будет. Если память будет жрать, то придется слушать
> Digitman ©   (01.12.05 17:37) [13]
. Если нет - значит проблема не в этом коде, а в потоке.



Страницы: 1 вся ветка

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
3-1130937681
Александр_н
2005-11-02 16:21
2005.12.25
Получение информации о Primary Key


9-1121961704
Conferno
2005-07-21 20:01
2005.12.25
Bump map - Specular Texture(GLScene)


2-1134032904
Quattro
2005-12-08 12:08
2005.12.25
TChart


11-1114362587
Zoom
2005-04-24 21:09
2005.12.25
Save to Gif/Png


2-1133966544
Dead.MorozZ
2005-12-07 17:42
2005.12.25
Как устанавливать компоненты