HOWTO: Visual C# .NET에서 Trace 및 Debug 사용

기술 자료 번역 기술 자료 번역
기술 자료: 815788 - 이 문서가 적용되는 제품 보기.
이 문서의 Microsoft Visual Basic .NET 버전에 대한 내용은 313417을 참조하십시오.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 Debug 클래스와 Trace 클래스를 사용하는 방법을 설명합니다. 이들 클래스는 Microsoft .NET Framework에서 사용할 수 있으며 이를 사용하여 응용 프로그램 개발 동안 또는 구축 후 생산 단계까지 응용 프로그램의 성능에 대한 정보를 제공할 수 있습니다. 이들 클래스는 .NET Framework에서 사용할 수 있는 여러 가지 계측 기능 중 일부에 지나지 않습니다.

요구 사항

다음 목록은 권장하는 하드웨어, 소프트웨어, 네트워크 인프라 및 서비스 팩입니다.
  • Microsoft Windows 2000 또는 Microsoft Windows XP
  • Microsoft Visual C# .NET
이 문서는 또한 사용자가 프로그램 디버깅에 익숙하다고 가정합니다.

기술 설명


Debug 클래스가 있는 예제 만들기 절에 나와 있는 단계는 Debug 클래스를 사용하여 프로그램 실행에 대한 정보를 제공하는 콘솔 응용 프로그램을 만드는 방법을 설명합니다.

프로그램이 실행되면 Debug 클래스의 메서드를 사용하여 프로그램 실행 시퀀스를 모니터링하거나, 오작동을 검색하거나, 성능 측정 정보를 제공하는 데 도움을 주는 메시지를 생성할 수 있습니다. 기본적으로 Debug 클래스가 생성하는 메시지는 Visual Studio 통합 개발 환경(IDE)의 출력 창에 나타납니다.

예제 코드에서는 WriteLine 메서드를 사용하여 라인 종결자(line terminator)가 뒤에 오는 메시지를 생성합니다. 이 메서드를 사용하여 메시지를 생성하면 각 메시지가 출력 창에서 별도의 줄에 나타납니다.

Debug 클래스의 Assert 메서드를 사용하면 지정한 조건이 False로 확인될 때만 출력 창에 메시지가 표시됩니다. 메시지는 또한 모달 대화 상자에도 나타납니다. 대화 상자에는 메시지, 프로젝트 이름 및 Debug.Assert 문 번호가 포함되어 있습니다. 대화 상자에는 또한 다음과 같은 세 가지 명령 단추가 포함되어 있습니다.
  • 중단: 응용 프로그램이 실행을 중지합니다.
  • 다시 시도: 응용 프로그램이 디버그 모드로 들어갑니다.
  • 무시: 응용 프로그램이 계속 진행됩니다.
사용자가 먼저 이들 단추 중 하나를 눌러야 응용 프로그램이 계속될 수 있습니다.

또한 Debug 클래스의 출력을 출력 창 이외의 다른 목적지로 보낼 수 있습니다. Debug 클래스에는 Listener 개체를 포함하고 있는 Listeners라는 컬렉션이 있습니다.

Listener 개체는 Debug 출력을 모니터링하고 출력을 지정한 대상으로 보냅니다.

Listener 컬렉션의 각 ListenerDebug 클래스가 생성하는 출력을 모두 받습니다. Listener 개체를 정의하려면 TextWriterTraceListener 클래스를 사용하십시오. 생성자를 통해 TextWriterTraceListener 클래스의 대상을 지정할 수 있습니다.

다음과 같은 출력 대상을 사용할 수 있습니다.
  • 콘솔 창 - System.Console.Out 속성을 사용할 경우
  • 텍스트(.txt) 파일 - System.IO.File.CreateText("FileName.txt") 문을 사용할 경우
TextWriterTraceListener 개체를 만든 후에는 개체를 Debug.Listeners 컬렉션에 추가하여 Debug 출력을 받아야 합니다.

Debug 클래스가 있는 예제 만들기

  1. Visual Studio .NET을 시작합니다.
  2. conInfo라는 Visual C# .NET 콘솔 응용 프로그램 프로젝트를 새로 만듭니다. Class1이 만들어집니다.
  3. Class1의 맨 위에 다음 네임스페이스를 추가합니다.
    using System.Diagnostics;
  4. 제품에 대한 정보를 포함하도록 변수를 초기화하려면 Main 메서드에 다음 선언문을 추가합니다.
    string sProdName = "Widget";
    int iUnitQty = 100;
    double dUnitCost = 1.03;
  5. 클래스가 생성하는 메시지를 WriteLine 메서드의 첫 번째 입력 매개 변수로 지정합니다. Ctrl+Alt+O를 눌러 출력 창이 표시되는지 확인합니다.
    Debug.WriteLine("Debug Information-Product Starting ");
  6. 읽기 쉽도록 Indent 메서드를 사용하여 출력 창에서 후속 메시지를 들여씁니다.
    Debug.Indent();
  7. 선택한 변수의 내용을 표시하려면 WriteLine 메서드를 다음과 같이 사용합니다.
    Debug.WriteLine("The product name is " + sProdName);
    Debug.WriteLine("The available units on hand are" + iUnitQty.ToString());
    Debug.WriteLine("The per unit cost is " + dUnitCost.ToString());
  8. 또한 WriteLine 메서드를 사용하여 존재하는 개체의 네임스페이스와 클래스 이름을 표시할 수 있습니다. 예를 들어 다음 코드는 출력 창에 System.Xml.XmlDocument 네임스페이스를 표시합니다.
    System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();
    Debug.WriteLine(oxml);
  9. 출력을 구성하기 위해 범주를 WriteLine 메서드의 선택적인 두 번째 입력 매개 변수로 포함시킬 수 있습니다. 범주를 지정할 경우 출력 창 메시지의 형식은 "범주: 메시지"입니다. 예를 들어 다음 코드의 첫 줄은 출력 창에 "Field: The product name is Widget"를 표시합니다.
    Debug.WriteLine("The product name is " + sProdName,"Field");
    Debug.WriteLine("The units on hand are" + iUnitQty,"Field");
    Debug.WriteLine("The per unit cost is" + dUnitCost.ToString(),"Field");
    Debug.WriteLine("Total Cost is  " + (iUnitQty * dUnitCost),"Calc");
  10. 출력 창은 지정한 조건이 True로 확인된 경우에만 Debug 클래스의 WriteLineIf 메서드를 사용하여 메시지를 표시할 수 있습니다. 평가할 조건은 WriteLineIf 메서드의 첫 번째 입력 매개 변수입니다. WriteLineIf의 두 번째 매개 변수는 첫 번째 매개 변수의 조건이 True로 확인된 경우에만 나타나는 메시지입니다.
    Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");
    Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");
    
  11. Debug 클래스의 Assert 메서드를 사용하여 지정한 조건이 Flase로 확인된 경우에만 출력 창에 메시지가 표시되도록 합니다.
    Debug.Assert(dUnitCost > 1, "Message will NOT appear");
    Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");
    
  12. 콘솔 창(tr1)과 Output.txt라는 텍스트 파일(tr2)에 대해 TextWriterTraceListener 개체를 만든 다음 각 개체를 Debug Listeners 컬렉션에 추가합니다.
    TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
    Debug.Listeners.Add(tr1);
            
    TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("Output.txt"));
    Debug.Listeners.Add(tr2);
  13. 읽기 쉽도록 Unindent 메서드를 사용하여 Debug 클래스가 생성하는 후속 메시지의 들여쓰기를 제거합니다. Indent 메서드와 Unindent 메서드를 함께 사용하면 읽기 프로그램이 출력을 그룹으로 구분할 수 있습니다.
    Debug.Unindent();
    Debug.WriteLine("Debug Information-Product Ending");
  14. Listener 개체가 출력을 모두 받는지 확인하려면 Debug 클래스 버퍼에 대해 Flush 메서드를 호출합니다.
    Debug.Flush();

Trace 클래스 사용

또한 Trace 클래스를 사용하여 응용 프로그램의 실행을 모니터링하는 메시지를 생성할 수 있습니다. Trace 클래스와 Debug 클래스는 동일한 메서드를 대부분 공유하여 다음과 같은 출력을 포함한 출력을 생성합니다.
  • WriteLine
  • WriteLineIf
  • Indent
  • Unindent
  • Assert
  • Flush
Trace 클래스와 Debug 클래스는 같은 응용 프로그램 내에서 따로따로 사용하거나 함께 사용할 수 있습니다. Debug 솔루션 구성 프로젝트에는 Trace 출력과 Debug 출력이 모두 활성화되어 있습니다. 프로젝트는 이들 클래스 모두에서 모든 Listener 개체로의 출력을 생성합니다. 그러나 Release 솔루션 구성 프로젝트는 Trace 클래스의 출력만 생성합니다. Release 솔루션 구성 프로젝트는 Debug 클래스 메서드 호출을 무시합니다.
Trace.WriteLine("Trace Information-Product Starting ");
Trace.Indent();

Trace.WriteLine("The product name is "+sProdName);
Trace.WriteLine("The product name is"+sProdName,"Field" );
Trace.WriteLineIf(iUnitQty > 50, "This message WILL appear");
Trace.Assert(dUnitCost > 1, "Message will NOT appear");
        
Trace.Unindent();
Trace.WriteLine("Trace Information-Product Ending");

Trace.Flush();

Console.ReadLine();

작동 여부 확인

  1. Debug가 현재 솔루션 구성인지 확인합니다.
  2. 솔루션 탐색기 창이 보이지 않으면 Ctrl+Alt+L을 눌러 이 창을 표시합니다.
  3. conInfo를 마우스 오른쪽 단추로 누른 다음 속성을 누릅니다.
  4. conInfo 속성 페이지 왼쪽 창의 구성 속성 폴더에서 화살표가 디버깅을 가리키는지 확인합니다.
  5. 구성 속성 폴더 위의 구성 드롭다운 목록 상자에서 활성(Debug)이나 Debug를 누른 다음 확인을 누릅니다.
  6. Ctrl+Alt+O를 눌러 출력 창을 표시합니다.
  7. F5 키를 눌러 코드를 실행합니다. 어설션 오류 대화 상자가 나타나면 무시를 누릅니다.
  8. 콘솔 창에서 Enter 키를 누릅니다. 프로그램이 종료되고 출력 창에 다음과 같은 출력이 표시됩니다.
        Debug Information-Product Starting 
        The product name is Widget
        The available units on hand are100
        The per unit cost is 1.03
        System.Xml.XmlDocument
        Field: The product name is Widget
        Field: The units on hand are100
        Field: The per unit cost is1.03
        Calc: Total Cost is  103
        This message WILL appear
        ---- DEBUG ASSERTION FAILED ----
    ---- Assert Short Message ----
    Message will appear since dUnitcost  < 1 is false
    ---- Assert Long Message ----
    
    
        at Class1.Main(String[] args)  <%Path%>\class1.cs(34)
    
        The product name is Widget
        The available units on hand are100
        The per unit cost is 1.03
    Debug Information-Product Ending
    Trace Information-Product Starting 
        The product name is Widget
        Field: The product name isWidget
        This message WILL appear
    Trace Information-Product Ending
                        
    
  9. 콘솔 창과 Output.txt 파일에 다음과 같은 출력이 표시됩니다.
    The product name is Widget
        The available units on hand are 100
        The per unit cost is 1.03
    Debug Information-Product Ending
    Trace Information-Product Starting 
        The product name is Widget
        Field: The product name is Widget
        This message WILL appear
    Trace Information-Product Ending			
    
참고 Output.txt 파일은 conInfo 실행 파일(conInfo.exe)과 같은 디렉터리에 있습니다. 일반적으로 이 디렉터리는 프로젝트 소스가 저장되는 \bin 폴더입니다. 이 폴더는 기본적으로 C:\Documents and Settings\User login\My Documents\Visual Studio Projects\conInfo\bin입니다.

전체 코드 예제

   using System;
   using System.Diagnostics;

   class Class1
   {
      [STAThread]
      static void Main(string[] args)
      {
         string sProdName = "Widget";
         int iUnitQty = 100;
         double  dUnitCost = 1.03;
         Debug.WriteLine("Debug Information-Product Starting ");
         Debug.Indent();
         Debug.WriteLine("The product name is "+sProdName);
         Debug.WriteLine("The available units on hand are"+iUnitQty.ToString());
         Debug.WriteLine("The per unit cost is "+ dUnitCost.ToString());

         System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();
         Debug.WriteLine(oxml);

         Debug.WriteLine("The product name is "+sProdName,"Field");
         Debug.WriteLine("The units on hand are"+iUnitQty,"Field");
         Debug.WriteLine("The per unit cost is"+dUnitCost.ToString(),"Field");
         Debug.WriteLine("Total Cost is  "+(iUnitQty * dUnitCost),"Calc");

         Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");
         Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");

         Debug.Assert(dUnitCost > 1, "Message will NOT appear");
         Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost  < 1 is false");

         TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
         Debug.Listeners.Add(tr1);
        
         TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("Output.txt"));
         Debug.Listeners.Add(tr2);
         
 
         Debug.WriteLine("The product name is "+sProdName);
         Debug.WriteLine("The available units on hand are"+iUnitQty);
         Debug.WriteLine("The per unit cost is "+dUnitCost);
         Debug.Unindent();
         Debug.WriteLine("Debug Information-Product Ending");
         Debug.Flush();
         
         Trace.WriteLine("Trace Information-Product Starting ");
         Trace.Indent();

         Trace.WriteLine("The product name is "+sProdName);
         Trace.WriteLine("The product name is"+sProdName,"Field" );
         Trace.WriteLineIf(iUnitQty > 50, "This message WILL appear");
         Trace.Assert(dUnitCost > 1, "Message will NOT appear");
        

         Trace.Unindent();
         Trace.WriteLine("Trace Information-Product Ending");

         Trace.Flush();

         Console.ReadLine();
      }			
   }
참고 이 예제 코드가 작동하려면 코드의 첫 줄에 using System.Diagnostics;를 붙여 넣어 System.Diagonstics 네임스페이스를 추가해야 합니다.

문제 해결

  • 솔루션 구성 형식이 Release이면 Debug 클래스 출력이 무시됩니다.
  • 특정 대상에 대한 TextWriterTraceListener 클래스를 만들면 TextWriterTraceListenerTrace 클래스와 Debug 클래스에서 출력을 받습니다. Listeners 클래스에 TextWriterTraceListener를 추가할 때 TraceDebug 중 어떤 클래스의 Add 메서드를 사용했는지에 관계 없이 위와 같은 상황이 발생합니다.
  • Trace 클래스와 Debug 클래스에서 같은 대상에 대한 Listeners 개체를 추가하면 DebugTrace 중 어떤 클래스가 해당 출력을 생성했는지에 관계 없이 각 출력 줄이 중복됩니다.
             TextWriterTraceListener myWriter = new TextWriterTraceListener(System.Console.Out);
             Debug.Listeners.Add(myWriter);
            
             TextWriterTraceListener myCreator = new TextWriterTraceListener(System.Console.Out);
             Trace.Listeners.Add(myCreator);
             
    

참조

자세한 내용은 .NET Framework Class Library 설명서의 다음 항목을 참조하십시오.
Trace 클래스
http://msdn2.microsoft.com/en-us/library/system.diagnostics.trace(vs.71).aspx

Debug 클래스
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDiagnosticsDebugClassTopic.asp


추적에 대한 자세한 내용은 Microsoft GotDotNet Quickstart 자습서의 다음 항목을 참조하십시오.
추적 작업
http://samples.gotdotnet.com/quickstart/howto/doc/Trace.aspx




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 815788 - 마지막 검토: 2007년 5월 13일 일요일 - 수정: 1.4
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
키워드:?
kbprogramming kbdebug kbnamespace kbhowtomaster KB815788

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com