본문 바로가기

Programming/.NET

Debug / Release

프로그램을 개발할때 오류가 발생하면 대부분 Visual Studio의 디버거 프로그램을 통해 문제가 되는 코드를 찾아 수정하는 방법으로 해결이 가능합니다.

 

static void Main(string[] args)
{
    int[] i = new int[] { 0, 1, 2, 3, 4 };
    i[5] = 0;
}

 

이 프로그램은 컴파일시에는 정상적으로 처리되지만 정작 실행할때는 오류가 발생될것입니다. 그러나 다음과 같이 오류가 발생되는 정확한 소스코드 라인을 알려주기에 곧장 문제되는 부분을 찾아 수정하는 것이 가능합니다.

 

 

빌드하고 난 이후의 실행파일을 실행했을 뿐인데 이러한 소스코드상의 정보를 출력해 디버깅이 가능하도록 할 수 있는 이유는 프로젝트 자체를 Debug 모드로 빌드했기 때문입니다. 프로그램을 Debug모드로 빌드하게 되면 컴파일러는 소스코드를 전혀 건드리지 않으면서 소스코드관련 정보를 가지고 있는 PDB(program database)파일을 생성하게 되고, 문제가 발생했을 경우 CLR이 PDB파일을 로드하여 소스코드의 정보를 알려주는 것입니다.

 

그렇다면 소스코드를 건드리지 않는다는건 무슨 뜻일까요?

 

CLR은 프로그램이 실행될때의 성능에 맞게 소스코드 자체에 최적화를 적용하게 되는데 이는 빌드되는 과정에서 '최적화'라는 단계의 작업에 해당합니다. 예를 들어

 

static void Main(string[] args)
{
    int[] i = new int[] { 0, 1, 2, 3, 4 };
    SetArray(i);
}

static void SetArray(int[] i)
{
     i[5] = 0;
}

 

위와 같은 소스코드는 최적화를 거치면 아래와 같이 바뀔것입니다.

 

static void Main(string[] args)
{
    int[] i = new int[] { 0, 1, 2, 3, 4 };
    i[5] = 0;
}

 

이렇게 되는 이유는 굳이 메서드로 분리된 코드를 유지하면 매개변수로 값을 전달하고 해당 메서드를 호출해야 하는 등의 과정이 필요하기 때문입니다. 따라서 성능상 차라리 메서드의 내용을 호출자에 통째로 넣어버리는 것이 더 빠르기 때문에 위와 같은 결과가 발생하는 것입니다.(물론 모든 상황에서 이러한 동작이 수행된다고는 보장할 수 없지만) 결국 코드의 내용이 달라져 버린다는 것이 핵심이고 이런 처리를 수행하는 것은 프로젝트의 빌드모드를 Release로 했을경우에 해당합니다.

 

프로그램을 개발하는 개발단계에서 Release로 빌드하지 않는 이유는 바로 이 때문입니다. 최적화과정에서 소스코드를 변경해 버리면 디버거는 엉뚱한 소스코드의 라인을 알려주며 오류정보를 전달할 수 있기 때문입니다. 설령 PDB파일이 있다고 하더라도 PDB는 최적화 이전의 소스코드정보를 갖고 있기 때문에 별 도움이 되지 않습니다.

 

좀 다른 얘기지만 프로그램을 만들때 특정 조건의 실행여부를 판단하기 위해 종종 Console이나 혹은 MessageBox 클래스를 통해 메세지를 표시하곤 하는데 화면에 원하는 내용을 출력하기 보다는 Debug나 Trace를 사용하면 Visual Studio의 출력창을 통해 좀더 깔끔하게 메세지를 표시할 수 있습니다.

 

static void Main(string[] args)
{
    Debug.WriteLine("실행중.");
    Trace.WriteLine("실행중.");
}

 

간혹 프로그램을 빌드하는 이 2가지 모드가 무시되는 경우가 있으나 개발단계에서는 프로그램의 정확한 디버깅을 위해 Debug모드로, 사용자에게 배포할때는 Release모드로 빌드하는 습관을 들이는 것이 좋습니다.

'Programming > .NET' 카테고리의 다른 글

[C#] partial  (0) 2019.02.07
[C#] 비동기 호출(asynchronous call)  (0) 2019.01.23
Debug / Release  (0) 2019.01.15
[ASP.NET MVC] Razor  (0) 2019.01.08
[ASP.NET MVC] URL 다루기  (0) 2018.12.18
[C#] 비트(bit) 연산자  (0) 2018.11.20

태그