자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi [베를린] 데이터스냅 서버의 핸들(메모리 릭)이 계속 증가하는 것 해결하지 못하고... 만세...
2016.05.26 16:31
본 게시판 사용시 당부 사항
* 이 게시판은 자유롭게 질문을 올리고 자발적으로 답변을 공유하는 게시판입니다.
* 어느 누구도 답변을 달아야만 하는 책임은 없습니다.
* 따라서 질문을 올리실 때에는 최대한 자세하고 정중하게 질문을 올려 주세요.
* 최대한 질문을 자세히 올려야 답변도 자세히 올라 옵니다.
* 본 질문에 답변을 주시는 여러 개발자님들께 미리 감사드립니다.
-----------------------------------------------------------------------------------------------
위저드로 간단하게 데이터스냅 서버와 클라이언트를 만들어 테스트하고 있는데,
클라이언트에서 서버에 접속할 때마다 윈도우작업관리자의 핸들수가 계속 증가합니다.
한번 접속하고 메소드를 여러번 호출하는 것은 이상 없습니다.
이 문제가 XE7까지는 모르겠지만 XE8, 10 씨애틀, 10 씨애틀 업데이트1에서도 같은 현상이 있습니다.
이번에 출시된 베를린을 기대하고 설치해서 테스트를 하는데 역시 동일 증상이 있습니다.
첨부한 파일은 위저드에서 만들어진 서버와 간단한 클라이언트입니다.
** 클라이언트 설명 **
-- 기능 : 서버 메소드에서 현재 시간을 EchoString으로 표시만 합니다.
-- 연결 : 서버연결
-- 해제 : 서버연결해제
-- 반복테스트 : 연결 및 해제를 반복
첨부된 서버 내용중 아래 부분은 생략되었지만 아래와 같이 넣어서 충분히 테스트했습니다.
컨테이버 유닛과 서버 메소드 유닛의 생성, 해제하는 이벤트가 처리되는 것은 로그로 확인했습니다.
...
procedure TServerContainer1.DSServerClass1CreateInstance(DSCreateInstanceEventObject: TDSCreateInstanceEventObject);
begin
// DSCreateInstanceEventObject.ServerClassInstance := TServerMethods1.Create( nil );
end;
procedure TServerContainer1.DSServerClass1DestroyInstance(DSDestroyInstanceEventObject: TDSDestroyInstanceEventObject);
begin
// DSDestroyInstanceEventObject.ServerClassInstance.Free;
end;
...
방법이 없을까요?
// 감사합니다 //
댓글 8
-
험프리
2016.05.27 09:49
-
델사냥
2016.05.28 09:32
TDSTCPServerTransport 를 사용하면 이상없고, TDSHTTPService를 사용하면 위와 같은 현상이 있습니다.
...
감사합니다.
-
관리자2
2016.06.01 11:08
안녕하세요.
데이터 스냅 관련 문제 해결에 관심을 보여주셔서 감사합니다.
해당 문제를 엠바카데로 QC 프로그램을 통해 올려 주시는 것이 어떨지요?
제품 관련 문제점을 본사에 적극적으로 리포팅 한다면 우리나라의 델파이 사용자에 대한 관심도 높아질 수 있을 뿐더러 제품의 개선에서도 큰 도움이 됩니다.(http://tech.devgear.co.kr/delphi_news/409911 )
감사합니다.
-
델사냥
2016.06.01 21:55
QC ?
QC에도 비슷한 내용의 글들이 여러개 올라와 있지만 해결 방법은 없어 보입니다.
또한 특정 버전에 패치나 적용된 것으로 나오지만
정작 최신 버전들에서도 관련 버그가 있고
그것도 위저드로 만들어진 간단한 소스에서 그러하니...
...
한참동안은 팽겨쳐 놓고 보지 않으려고 합니다.
...
꾸뻑
-
험프리
2016.06.10 15:13
해당 현상을 테스트해보고 제현해 봤습니다.
결론을 말씀드리면
데이터스냅 서버에서 일부 핸들을 닫는 코드가 누락된 것을 발견했습니다.
좀 더 구체적으로 말하면
TThread를 상속받은 TDSLocalServer 클래스의 Destroy 이벤트에서 inherited Destroy; 코드가 누락되어
TThread.Destroy 메소드를 호출하지 않습니다.
TThread.Destroy 메소드에는 쓰레드 핸들을 닫는 CloseHandle 등의 코드가 있습니다.
아래와 같이 inherited Destroy 코드를 추가하면 될것으로 생각합니다.
// Datasnap.DSSession.pas 1218 line
destructor TDSLocalServer.Destroy;
begin
inherited Destroy; // 요 코드가 빠져서 TThread.Destroy 가 실행되지 않습니다.(TThread.Destroy에서 쓰레드 핸들을 닫는 코드가 있습니다.)
FreeAndNil( FDBXProtocolHandler );
FLocalChannel := nil; // soft reference
end;
위 이유로 클라이언트가 접속했다 끊어지면 핸들이 하나씩 증가하는 현상이 발생하네요.
위 내용은 본사에 레포팅하도록 하겠습니다. 패치되는 내용이 있으면 다시 안내드리겠습니다.
PS - 수정한 내용을 적용하려고 데이터스냅 소스코드 컴파일을 시도했으나, 참조하는 코드들이 많아서 컴파일 과정을 실패했습니다. ㅠㅜ(참고하세요.)
-
험프리
2016.06.10 16:31
본사에 다음과 같이 레포팅되었습니다.
https://quality.embarcadero.com/browse/RSP-15176
-
델사냥
2016.06.12 11:05
데이터스냅 소스를 수정하는 것은 차기 버전도 그렇고 또 내공 부족으로 부담되어
1분 간격으로 쓰레드가 끝난 핸들을 찾아 CloseHandle 해주는 것으로 해결했습니다.
감사합니다.
-
험프리
2017.09.13 13:33
해당 이슈는 10.2 도쿄 릴리즈 1에서 패치되었습니다.
http://tech.devgear.co.kr/delphi_news/435381
Delphi [베를린] 데이터스냅 서버의 핸들(메모리 릭)이 계속 증가하는 것 해결하지 못하고... 만세...
2016.05.26 16:31
본 게시판 사용시 당부 사항
* 이 게시판은 자유롭게 질문을 올리고 자발적으로 답변을 공유하는 게시판입니다.
* 어느 누구도 답변을 달아야만 하는 책임은 없습니다.
* 따라서 질문을 올리실 때에는 최대한 자세하고 정중하게 질문을 올려 주세요.
* 최대한 질문을 자세히 올려야 답변도 자세히 올라 옵니다.
* 본 질문에 답변을 주시는 여러 개발자님들께 미리 감사드립니다.
-----------------------------------------------------------------------------------------------
위저드로 간단하게 데이터스냅 서버와 클라이언트를 만들어 테스트하고 있는데,
클라이언트에서 서버에 접속할 때마다 윈도우작업관리자의 핸들수가 계속 증가합니다.
한번 접속하고 메소드를 여러번 호출하는 것은 이상 없습니다.
이 문제가 XE7까지는 모르겠지만 XE8, 10 씨애틀, 10 씨애틀 업데이트1에서도 같은 현상이 있습니다.
이번에 출시된 베를린을 기대하고 설치해서 테스트를 하는데 역시 동일 증상이 있습니다.
첨부한 파일은 위저드에서 만들어진 서버와 간단한 클라이언트입니다.
** 클라이언트 설명 **
-- 기능 : 서버 메소드에서 현재 시간을 EchoString으로 표시만 합니다.
-- 연결 : 서버연결
-- 해제 : 서버연결해제
-- 반복테스트 : 연결 및 해제를 반복
첨부된 서버 내용중 아래 부분은 생략되었지만 아래와 같이 넣어서 충분히 테스트했습니다.
컨테이버 유닛과 서버 메소드 유닛의 생성, 해제하는 이벤트가 처리되는 것은 로그로 확인했습니다.
...
procedure TServerContainer1.DSServerClass1CreateInstance(DSCreateInstanceEventObject: TDSCreateInstanceEventObject);
begin
// DSCreateInstanceEventObject.ServerClassInstance := TServerMethods1.Create( nil );
end;
procedure TServerContainer1.DSServerClass1DestroyInstance(DSDestroyInstanceEventObject: TDSDestroyInstanceEventObject);
begin
// DSDestroyInstanceEventObject.ServerClassInstance.Free;
end;
...
방법이 없을까요?
// 감사합니다 //
댓글 8
-
험프리
2016.05.27 09:49
-
델사냥
2016.05.28 09:32
TDSTCPServerTransport 를 사용하면 이상없고, TDSHTTPService를 사용하면 위와 같은 현상이 있습니다.
...
감사합니다.
-
관리자2
2016.06.01 11:08
안녕하세요.
데이터 스냅 관련 문제 해결에 관심을 보여주셔서 감사합니다.
해당 문제를 엠바카데로 QC 프로그램을 통해 올려 주시는 것이 어떨지요?
제품 관련 문제점을 본사에 적극적으로 리포팅 한다면 우리나라의 델파이 사용자에 대한 관심도 높아질 수 있을 뿐더러 제품의 개선에서도 큰 도움이 됩니다.(http://tech.devgear.co.kr/delphi_news/409911 )
감사합니다.
-
델사냥
2016.06.01 21:55
QC ?
QC에도 비슷한 내용의 글들이 여러개 올라와 있지만 해결 방법은 없어 보입니다.
또한 특정 버전에 패치나 적용된 것으로 나오지만
정작 최신 버전들에서도 관련 버그가 있고
그것도 위저드로 만들어진 간단한 소스에서 그러하니...
...
한참동안은 팽겨쳐 놓고 보지 않으려고 합니다.
...
꾸뻑
-
험프리
2016.06.10 15:13
해당 현상을 테스트해보고 제현해 봤습니다.
결론을 말씀드리면
데이터스냅 서버에서 일부 핸들을 닫는 코드가 누락된 것을 발견했습니다.
좀 더 구체적으로 말하면
TThread를 상속받은 TDSLocalServer 클래스의 Destroy 이벤트에서 inherited Destroy; 코드가 누락되어
TThread.Destroy 메소드를 호출하지 않습니다.
TThread.Destroy 메소드에는 쓰레드 핸들을 닫는 CloseHandle 등의 코드가 있습니다.
아래와 같이 inherited Destroy 코드를 추가하면 될것으로 생각합니다.
// Datasnap.DSSession.pas 1218 line
destructor TDSLocalServer.Destroy;
begininherited Destroy; // 요 코드가 빠져서 TThread.Destroy 가 실행되지 않습니다.(TThread.Destroy에서 쓰레드 핸들을 닫는 코드가 있습니다.)
FreeAndNil( FDBXProtocolHandler );
FLocalChannel := nil; // soft reference
end;
위 이유로 클라이언트가 접속했다 끊어지면 핸들이 하나씩 증가하는 현상이 발생하네요.
위 내용은 본사에 레포팅하도록 하겠습니다. 패치되는 내용이 있으면 다시 안내드리겠습니다.
PS - 수정한 내용을 적용하려고 데이터스냅 소스코드 컴파일을 시도했으나, 참조하는 코드들이 많아서 컴파일 과정을 실패했습니다. ㅠㅜ(참고하세요.)
-
험프리
2016.06.10 16:31
본사에 다음과 같이 레포팅되었습니다.
https://quality.embarcadero.com/browse/RSP-15176
-
델사냥
2016.06.12 11:05
데이터스냅 소스를 수정하는 것은 차기 버전도 그렇고 또 내공 부족으로 부담되어
1분 간격으로 쓰레드가 끝난 핸들을 찾아 CloseHandle 해주는 것으로 해결했습니다.
감사합니다.
-
험프리
2017.09.13 13:33
해당 이슈는 10.2 도쿄 릴리즈 1에서 패치되었습니다.
http://tech.devgear.co.kr/delphi_news/435381
제가 외부 프로젝트를 나와있어 시간이 좀 걸리겠지만 테스트 후 안내드리도록 하겠습니다.