Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.019 c
14-1133550555
AlexWlad
2005-12-02 22:09
2005.12.25
неопределенность понятий...


1-1133334608
kot1110
2005-11-30 10:10
2005.12.25
Unit тесты


14-1133500905
Nic
2005-12-02 08:21
2005.12.25
Не работает TV Tuner


14-1133576668
dust
2005-12-03 05:24
2005.12.25
BackUP для исходников Кто и чем??


6-1126365368
Express
2005-09-10 19:16
2005.12.25
Socket





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский