본문 바로가기

Programming/C&C++

debug <=> release 모드의 차이점과 배포

출처 : http://jiny2097.blog.me/30043517038


릴리즈 모드 (프로그램을 배포하기 위해 컴파일 하는 모드)
- 초기화 하지 않습니다.
- 같은 문자열 상수라도 서로 다른 공간에 할당됩니다.
- 디버깅정보를 삽입하지 않고 코드를 최적화하여 실행 파일 크기를 최대한 줄여줍니다.
- 속도나 크기면에서 월등히 유리합니다. (메모리 점유율로 낮아지고 실행도 빨라짐)
- 더 이상 현재버전에서 내결함성이나 문제점들을 발견할 수 없었을때 빌드하여 주는 모드입니다.

디버깅 모드 (컴파일시 들어가는 디버깅에 필요한 자질구리한 정보를 뺀 알짜 프로그램만 쏙 뽑아냄)
- 실행파일에 디버깅 정보를 삽입하여 언제든지 디버깅을 할 수 있도록 하며 Debug서브 폴더에 실행파일을
   만들어줍니다.
- 디버깅정보가 들어가 있기때문에 실행파일 상태를 확인할 수 있습니다.
- 디버그에 필요한 정보들을 실행시 계속 체크함으로써 속도가 느립니다.
- 디버그 빌드와 릴리즈 빌드에서 서로 실행 결과가 다른 경우?
   특히 디버그 빌드에서는 괜찮은데 릴리즈 빌드에서만 오류가 발생하여 프로그램이 죽는 경우가 있는데 
   이런 경우는 대부분 메모리가 깨진 경우에 발생합니다. 두 모드에서 동적으로 메모리를 할당하면 힙 영역에
   요청한 크기만큼 메모리를 할당 받게 되는데 그 초기값이 다릅니다.
- 릴리즈 모드와 디버깅모드의 차이점은?
   디버깅 정보를 실행코드 안에 넣느냐 안 넣느냐가 차이점이 되겠지요.
   즉, 디버거 모드로 컴파일하게되면 실행상태에서 추적할수 있는 정보가 실행파일 안에 들어가게 되므로
   용량이 커지고, 릴리즈 모드의 경우 디버깅 정보없어 순수한 소스코드자체의 기능만 컴파일되어 실행파일로
   만들어집니다.



1. debug 모드랑 release 모드는 bin 내용에 차이가 있습니다. 
    release 를 단순히 excution binary라고 하면 
    debug 모드는 debugging 가능한 정보를 포함한 excution binary가 되겠지요.
    결국 debugging 정보를 볼수 있는 dll들이 필요하게 되는데.. 
    ms dev 의 MFC42D.DLL, MFCN42D.DLL, MFCO42D.DLL, MSVCRTD.DLL 같은 것들이 필요하게 됩니다. 
    그리고 .. 특이하게도 .. 
    release 모드 실행화일은 죽는데... debug 모드 실행화일은 살아서 잘 돌아가는 경우도 있습니다. 
    아까 말씀드린것처럼 debug 모드는 추가 정보가 있기 때문에 boundary(memory 영역침범)에 대해 
    조금 더 버티는 운이 좋은(?) 경우가 있습니다. 
    이런경우는 boundary를 유발하는 장애가 반드시 있으니.. 밤을 세워서라도 잡아야만 배포하실수 있습니다. ^^


2. Debug모드와 Release모드의 차이점은
    사용하는 dll 차이
    Debug모드 : mfc42*d.dll(*: 없거라 한 개의 문자임..)
    Release모드 : mfc42.dll
    실행 파일 크기는 Debug모드는 Release모드의 3-4배 정도..
    Debug모드 개발을 하는 이유는 주로 조건 결과에서 잘못된 부분을 알려줌..


3. Debug mode에서 컴파일시에 Debug정보를 삽입합니다.
    따라서 Debug할때 에러난 파일과 라인을 알 수 있겠죠?
    그러나, Release mode에서는 그러한 debug정보가 빠지고, 여러가지 프로그램을 체크하
    는 루틴도 역시 빠져 있습니다. 
    물론, dll도 Debug와 Release mode가 다릅니다.
    사용하는 dll이 Debug모드에서 컴파일 및 링크가 된 것이라면 문제가 있겠죠?
    그러나, MS에서 제공하거나 회사에서 정식으로 제공하는 dll이라면 잘 돌아갈 겁니다.
    그리고, 또다른 차이점은 초기화의 문제입니다. Debug mode에서는 옵션으로 변수를 항
    상 초기화 할 수 있는데, Release mode에서는 자동으로 되지 않습니다.
    warning을 잘 보세요... Rebulid all 하셔서 warning이 하나라도 뜨면 주의깊게 보시
    고 모두 없애주시는 것이 좋을 겁니다


4. 원래 debug나 release나 컴파일했을때 결과는 동일합니다.
    만약 결과가 다르게 나왔다면 문제는 하나!~!!! 
    님이 실수하신겁니다. 메모리쪽 살펴보세요. 특히 배열을 잘 보세요.
    배열 접근이 잘못 되었을때 일어납니다.
    int ap[3];
    ap[3] =0;  이런식의 접근이 예입니다.
    ap[3] 이렇게 했으면 ap[2] 까지만 접근이 가능하죠...?
    이건 한 예일 뿐이니 나머지는 님이 열심히 연구해보세요.


5. 두 모드 둘다 잘되야 버그가 없는 가능성이 높은 프로그램이죠
    두 모드중 한모드가 안된다면 분명히 버그가 있다는 얘깁니다.
    메모리 지울때 버그나는것은 해당 메모리 영역이 덮어써졌기때문입니다.
    확인해서 고쳐주시면 될겁니다.

 

6.  Debug모드는 말 그대로 개발 환경이 갖추어진 상태에서 Debug용으로 제작되어지는 프로그램입니다.
    개발 환경이 갖추어지지 않았다면 내부적으로 사용되는 파일에서 에러를 발생시킬수 있겠지요..
    Release모드에서 에러가 발생한다고 해서 Debug로 배포를 하시겠다고 하는건 ^^;;
    잘 찾아보시면 Release모드에서도 디버깅 할수 있는 팁이 있습니다..
    참고해보시길 바랍니다.^^

   

7. 디버그로 배포시 같이 배포될 .dll 들이 다 디버그 버젼들을 같이 배포해야하니 
    그 크기도 만만치는 않죠.. 하지만 문제가 심각하다.. 절대 아닙니다. 그냥 해도 아무런 상관은 없습니다. 
    하지만 잘 조정하셔서 Release 모드를 배포하시는 것을 추천하기는 합니다.

 

8. 배포는 Release로..

    디버그 모드는 말그대로 디버그를 하기위해서
    필요한 정보들을 가지고 있는 dll들을 씁니다.
    디버그에 필요한 정보들을실행시에 계속 체크하니까,
    물로 느리겠저?
    하지만, 릴리즈는 그런거 하지않습니다.
    그래서 빠릅니다.
    머, 월등히 빠른건 아니지만,
    그래도 빠릅니다.
    그리고, 디버그는 배포할때.
    디버그용 dll도 같이 배포해야합니다.
    왜냐면...일반 피씨에 그런게 깔려있을리 만무하지여?  ㅡㅡ;
    릴리즈는 기본으로 윈도우에 깔려있습니다.
    디버그는 돼는데 릴리즈는 안돼는건..
    그런 경우 허다합니다...
    그래서 , 개발할때..
    기능하나 추가할때마다,
    릴리즈로 실행해서 테스트하는것이 
    젤좋은 방법입니다.
    최악의 경우,
    디버그로 배포하는경우도 있지여 ㅡㅡ;
    참고로, 릴리즈도 디버깅 가능합니다.
    릴리즈 죽을때..유용함돠..