C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[582] 디버그 모드로 실행시 일시 멈춤 현상에 대해...(추가2. 원인 찾음)
김태선 [jsdkts] 14360 읽음    2006-03-08 11:03
BCB 6를 오랫동안 사용해 왔습니다.
그간 데스크탑에서 개발할때는 별다른 문제가 없었는데,
노트북으로 개발할때 프로젝트가 커지면서 문제가 생겼습니다.

1. F9 로 실행시키면 어떤 때는 금방 실행되고 어떤 때는 한 10~30초 가량 멈춤현상이 생겼다가 실행됩니다.
이때 주로, 캡션바와 화면 일부를 그리다 말고 멈추어 있는 경우가 대부분입니다.
이때의 CPU 점유율은 거의 100% 수준이고 100%를 기록하지 않은 경우도 있습니다.

2. 프로젝트가 많이 커지면 실행시 어김없이 30-40초 가량 멈춤현상이 생기고 나서 실행됩니다.
또한 종료시도 원상태대로 돌아오는데 약 30초 가량이 또 걸립니다.

물론 개발중인 프로그램의 로직은 아무 이상 없으며,  IDE 디버그 모드를 해제하고 실행하거나,
그냥 탐색기에서 Make된 바이너리를 실행하는 경우는 아무런 문제가 없습니다.

문제는 디버깅을 위해 IDE 디버그 모드로 실행할 경우에 항상 일어난다는 것입니다.

이는 개발에 중대한 지장을 주는 것으로,
다른 사람의 경우를 찾아 보고, 인터넷 쪽에서 답을 일단의 검색을 해 봤지만 찾지는 못했습니다.

여러가지 개인적인 테스트를 한 결과,
문제는 IDE가 디버깅을 위해 실행 프로그램의 프로세스에 디버그 모드로 attach(달라붙는 것) 동작과
detach(떨어지는 것) 동작 과정의 직후와 직전에 일어난다는 것을 알았습니다.
IDE는 디버깅시 CPU에 디버깅 모드를 설정하고, 프로세스 메모리 전용 공간을 풀어서 접근할수 있게
조정하며 디버그 정보파일을 메모리에 올려 결합시켜 놓는 디버깅 준비와
종료시 이를 해제하는 과정을 수행합니다.

쓸데 없이 델파이 Forms.pas 소스 까지 살펴봤으나 동일 소스에 대해 델파이쪽은 문제가 거론된 적이 없었던
것으로 보아... 또한 멈춤이 일어나는 지점이 미미하게 달라진다는 점으로 보아
VCL이나 제작된 프로그램에 이상이 있는 것은 아니었습니다.

문제는 attach와 detach 동작시 마치 lock 이 걸린 것처럼 멈춤현상이 생긴다는데 있습니다.

일단의 해결방법은 성능 좋은 - 빠른 CPU와 1G 이상의 메모리, 빠른 HDD 를 갖춘다면
문제가 해결된다는 것입니다.

하지만 기왕이면 노트북에서 문제를 해결하고 싶더군요.

제가 사용하는 데스크탑의 경우는 1.5G P4 CPU에 512M 램인데 별다른 문제가 없고,
문제가 된 노트북은 1.8G P4 Mobile CPU에 512M 램, 데스크탑에 비해서 많이 느린 HDD 입니다.

그런데, 이 현상의 원인을 찾다가 발견한 사실은,
이 문제가 빌더 자체의 문제라기 보다는 OS와의 상호작용 사이의 문제라는 것입니다.

램이 512M이면 충분하지 않은 용량인데, 실행시 가상 메모리 페이징 파일로
스왑(메모리와 메모리 파일의 내용을 교환하는 일)이 일어나는 경우는
전체적인 OS가 매우 느려진다는 문제도 있습니다.


여기까지가 제가 파악한 내용입니다.
빌더에서의 개발 문제 중에 매우 중차대한 부분이라 생각되어 올립니다.
혹 잘못된 내용을 발견되거나, 새로 알게 되는 사실이 있으면 내용을 추가하겠습니다.
다른 의견이나 지적 사항은 리플 바랍니다.

//---------------------------------------------------------------------------
추가 수정 2.

오늘 원인을 드디어 찾았습니다.
빌더의 문제도 파일시스템의 문제도 가상메모리의 문제도 아니었습니다.
물론 가상 메모리 페이징이 일어나면 많이 느려지는 것은 사실이나
이것이 직접적인 이유는 아니었습니다.

실행시 딜레이 현상이 생기는 것중에
첫번째는 CPU를 100% 먹으면서 디버그모드로 실행할 준비를 하는 과정에서 지체되는 것이고,
두번째는 CPU는 0%에 가까운데 메인폼의 캡션바와 메뉴바 정도만 그려지고 10-20초가량 멈춰서 있는
경우가 있고,
세번째는 종료시 한 10-20초 멈춰서 있는 경우가 있습니다.

여기서 첫번째 문제는 컴 업글이 대안입니다. 첫번째 현상에 직면했다는 것은 자신이 개발 용도로
쓰고 있는 컴의 사양이 부족한 것입니다. 개인적으로 생각하기는
XP환경에서는 적어도 CPU 1.5G이상 램 1G 이상, 속도가 느리지 않은 HDD 정도는 갖춰야 할 것 같습니다.
Win2000의 경우는 램 512M에서도 무난했었습니다.

두번째 문제는 빌더의 디버그모드 하에서 발생하는 문제이지만,
결국 문제의 원인은 개발자가 찾아 제거할 수 밖에 없습니다.
저의 경우는 현재 컴퓨터의 IP를 얻기 위해 폼 생성시 아래와 같은 코드를 실행합니다.

    in_addr  inaddr = ClientSocket1->Socket->LookupName("");

이렇게 하면 inaddr 에 현재 컴의 IP가 담기게 되죠.
이 코드는 디버그모드가 아닌 경우는 거의 문제가 되지 않습니다.
하지만 디버그모드 하에서는 OS가 현재 자기 컴퓨터의 IP를 조회하기 위해,
일반적인 컴퓨터의 도메인네임 조회 방식을 사용하는 과정에서 일시적으로 시스템에 Lock을
거는데, 이때 디버그 모드하에서는 어떤 경우 Lock이 금방 풀리지 않아 10-20초 가량 지연되는 현상으로
나타납니다.
이 코드를 지우고 실행하면 지연현상 없이 여러번 실행해도 잘 동작하나,
이 코드가 있으면 10번에 한 3번 정도는 딱 멈춰서는 현상이 발생합니다.

결국 이 문제는 이와 유사하게 OS에 Lock 을 유발시키는 기능은 지연을 발생할 수 있는
가능성을 안고 있다는데 주목해야 합니다.
즉 위코드 뿐만 아니라, 특별한 환경의 개발 컴퓨터 상의 디버그 모드에서 지연을 일으킬 수 있는
코드는 더 있을 수 있다는 것이죠.

세번째는 저의 경우가 아니고, 다른분 중에 증상을 말씀하신 경우 입니다.
저는 겪어 보지 않아도 현재는 구체적으로 말씀을 드릴 부분이 없지만,
아마도 개발자 프로그램의 종료 프로세스 상에 문제가 아닌가 생각됩니다.
그렇다면 코드를 수정해 없앨 수 있겠지요.


이상의 문제는,
수 개월 동안 의문을 가지고 있었는데,
며칠전부터 문제를 밝혀보자는 결심으로 여러가지 실험과 인터넷에서 자료를 찾아 봤는데,
결국 가장 중요한 문제의 원인을 알아 정말 다행이군요. ^^;;;;
빌더의 모든 디버그 옵션 조정과  XP 환경 최적화,
수 기가 용량의 4만여개의 파일까지 다른 드라이브로 옮겨가며 실험했는데
... 머리가 돌이라서 겨우 알아 낸것 같습니다...

그럼... 참고하시고, 추가 사항이 생기면 또 달겠습니다.
혹 의견이 있으면 리플 바랍니다.
nicekr.황경록 [mpbox]   2006-03-13 00:58 X
^^::: 난해한 문제군요;;; 음.. 어떤 프로그램을 만드시길래~~~~ ^^~!! 전 코드라인은 별로 길지 않은 프로그램만 만들다보니 그런일이 없었네요 ^^;;
김태선 [jsdkts]   2006-04-13 14:32 X
노트북 512M, XP 에서는 실행시키면 보통 10-20초 딜레이되면서 실행되는데 비해,
데스크탑 512M, Win2000 에서는 전혀 지연없이 바로 실행됩니다.
물론 둘다 디버깅 환경에서이며, 탐색기에서 바로 실행시키면 차이는 없습니다.

이로 볼때, 개발환경으로는 램이 충분하지 않다면(?) Win2000이 더 나은 것 같습니다.
XP는 사용하기는 2000보다 편리한 점이 있는데,
개발에 이유를 알기 힘든 지장을 주는 점이 있습니다.
XP는 빠른 실행을 위해 여러 부분을 최적화 조정을 했는데, 크게 나아지지 않더군요.
이건 저의 경우이고, 다른 분은 어떨지 모르겠군요.

한 드라이버당 파일수가 12만개를 넘어가는 저의 개발용으로 할당한 드라이버는 NTFS로 되어 있는데 이 부분도 파일을 엑세스할때 상당히 딜레이를 주는 요소더군요.
아예 OS가 락에 잠시 잠시 걸리는 현상이 매우 신경 쓰이더군요.
그래서 백업받고 FAT32에 8K 클러스터로 다시 포멧하고 말았습니다.


+ -

관련 글 리스트
582 디버그 모드로 실행시 일시 멈춤 현상에 대해...(추가2. 원인 찾음) 김태선 14360 2006/03/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.