다음을 통해 공유


about_Debuggers

항목
    about_Debuggers

간단한 설명
    Windows PowerShell 디버거에 대해 설명합니다.


자세한 설명
    디버깅은 스크립트 명령에서 오류를 식별하고 수정하기 위해 스크립트를 실행 중에 검사하는 
    프로세스입니다. Windows PowerShell 디버거로 스크립트에서 오류와 비효율성을 검사하고 식별할 수 
    있습니다.
  

    참고: Windows PowerShell 디버거는 원격으로 실행되지 않습니다. 원격 컴퓨터에서 스크립트를 
          디버그하려면 로컬 컴퓨터로 스크립트를 복사하십시오.


    Windows PowerShell 디버거의 기능을 사용하여 Windows PowerShell 스크립트, 함수, 명령 
    또는 식을 실행 중에 검사할 수 있습니다. Windows PowerShell 디버거에는 중단점을 설정하고 중단점을 
    관리하며 호출 스택을 보는 cmdlet의 집합이 있습니다.
 

    Windows PowerShell은 스크립트, 함수 및 명령을 디버그하는 데 사용할 수 있는 여러 방법을 제공합니다.


    방법 1: Set-PsDebug cmdlet은 단계별 실행 및 추적을 포함한 기본 스크립트 디버깅 기능을 제공합니다. 
            자세한 내용을 보려면 다음을 입력하십시오.
            "get-help set-psdebug".


    방법 2: Set-StrictMode cmdlet을 사용하여 초기화되지 않은 변수에 대한 참조, 개체의 존재하지 않는 
            속성에 대한 참조 및 잘못된 함수 구문을 감지합니다.


    방법 3: 변수 값을 표시하는 문, 명령줄에서 입력을 읽는 문, 현재 명령을 보고하는 문 등의 진단문을 
            스크립트에 추가합니다. 이 작업에는 Write 동사가 포함된 Write-Host, Write-Debug, Write-
            Warning, Write-Verbose 등의 cmdlet을 사용합니다.

    방법 4: Windows PowerShell 디버거를 사용하여 스크립트를 디버그합니다. 또는 디버거를 사용하여 명령 
            프롬프트에 입력한 함수 또는 스크립트 블록을 디버그합니다. 중단점 설정, 스크립트 단계별 실행, 
            변수 값 검사, 진단 및 로깅 명령 실행, 호출 스택 표시 등의 작업을 수행할 수 있습니다. 
    
  디버거 Cmdlet
      Windows PowerShell 디버거에는 다음과 같은 cmdlet의 집합이 있습니다.


          Set-PsBreakpoint:     줄, 변수 및 명령에 중단점을 설정합니다. 

          Get-PsBreakpoint:     현재 세션에서 중단점을 가져옵니다.

          Disable-PsBreakpoint: 현재 세션에서 중단점을 끕니다.

          Enable-PsBreakpoint:  현재 세션에서 중단점을 다시 사용합니다.

          Remove-PsBreakpoint:  현재 세션에서 중단점을 삭제합니다.

          Get-PsCallStack:      현재 호출 스택을 표시합니다. 


  디버거 시작 및 중지
      디버거를 시작하려면 중단점을 하나 이상 설정합니다. 그런 다음에 디버그할 스크립트, 명령 또는 함수를 
      실행합니다. 


      중단점에 도달하면 실행이 중지되고 디버거로 제어가 전환됩니다.


      디버거를 중지하려면 완료될 때까지 스크립트, 명령 또는 함수를 실행합니다. 또는 "stop"이나 "t"를 
      입력하십시오. 
  

  디버거 명령
      Windows PowerShell 콘솔에서 디버거를 사용할 때는 다음 명령을 사용하여 실행을 제어합니다.
    

      참고: 다른 호스트 응용 프로그램에서 디버거를 사용하는 방법에 대한 자세한 내용은 호스트 응용 
            프로그램 설명서를 참조하십시오.


    s, Step-into        다음 문을 실행한 다음 중지합니다.


    v, Step-over        다음 문을 실행하지만 함수와 호출을 건너뜁니다. 건너뛴 문은 
                실행되지만 단계별로 실행되지는 않습니다.


    o, Step-out         현재 함수에서 나갑니다. 중첩된 경우에는 한 수준 위로 올라갑니다. 
                본문에 있는 경우 끝 또는 다음 중단점으로 계속합니다. 건너뛴 문은 
                실행되지만 단계별로 실행되지는 않습니다.


    c, Continue         스크립트가 완료될 때까지 또는 다음 중단점에 도달할 때까지 계속 
                실행합니다. 건너뛴 문은 실행되지만 단계별로 실행되지는 않습니다.


        l, List             실행 중인 스크립트 부분을 표시합니다. 기본적으로 현재 줄, 이전 
                5 줄 및 이후 10 줄이 표시됩니다. 스크립트를 계속 나열하려면 Enter 
                키를 누릅니다.
                        

        l <m>, List         <m>에서 지정한 줄 번호로 시작하는 스크립트 16줄을 
                표시합니다.                           

        l <m> <n>, List     <m>에서 지정한 줄 번호로 시작하는 스크립트 <n>줄을 
                표시합니다.                           

        q, Stop             스크립트 실행을 중지하고 디버거를 종료합니다.


        k, Get-PsCallStack  현재 호출 스택을 표시합니다.


    <Enter>             Step(s), Step-over(v), List(l)인 경우 마지막 명령을 
                반복합니다. 그렇지 않으면 전송 작업을 나타냅니다. 
                           

    ?, h                디버거 명령 도움말을 표시합니다.


      디버거를 종료하려면 Stop(q)을 사용합니다.


      디버거 내에서 명령 입력, 변수 값 표시, cmdlet 사용, 스크립트 실행 등의 작업을 수행할 수도 있습니다.


      이러한 디버거 명령을 사용하여 스크립트를 실행하거나 원하는 지점에서 중지하거나 변수 값과 시스템 
      상태를 검사하거나 문제를 식별할 때까지 스크립트를 계속 실행할 수 있습니다. 


  디버거 환경
      중단점에 도달하면 디버거 환경이 시작되고, 명령 프롬프트는 "[DBG]:"로 시작하도록 변경됩니다. 
      프롬프트를 사용자 지정할 수 있습니다.

     
      Windows PowerShell 콘솔과 같은 일부 호스트 응용 프로그램(Windows PowerShell 
      ISE[통합 스크립팅 환경] 제외)에서는 디버깅을 위해 중첩 프롬프트가 열립니다. 명령 프롬프트에 
      반복적으로 나타나는 보다 큼 문자(ASCII 62)로 중첩 프롬프트를 감지할 수 있습니다.


      예를 들어 다음은 Windows PowerShell 콘솔의 기본 디버깅 프롬프트입니다.


          [DBG]: PS (get-location)>>>


      $NestedPromptLevel 자동 변수를 사용하여 중첩 수준을 찾을 수 있습니다.


      자동 변수 $PSDebugContext도 로컬 범위에 정의됩니다. $PsDebugContext 변수의 유무로 디버거에 
      있는지 여부를 확인할 수 있습니다.


      예를 들면 다음과 같습니다.

 
          if ($psdebugcontext) {"Debugging"} else {"Not Debugging"}


      디버깅에서 $PSDebugContext 변수 값을 사용할 수 있습니다.


    [DBG]: PS>>> $psdebugcontext.invocationinfo

        Name   CommandLineParameters  UnboundArguments  Location
        ----   ---------------------  ----------------  --------
        =      {}                     {}                C:\ps-test\vote.ps1 (1)

  디버깅 및 범위
      디버거로 들어가도 작업하는 범위는 변경되지 않지만, 스크립트의 중단점에 도달하면 스크립트 범위로 
      이동합니다. 스크립트 범위는 디버거를 실행한 범위의 하위 항목입니다.


      스크립트 범위에 정의되는 변수와 별칭을 찾으려면 Get-Alias 또는 Get-Variable cmdlet의 Scope 
      매개 변수를 사용합니다.


      예를 들어 다음 명령은 로컬(스크립트) 범위에 있는 변수를 가져옵니다.


      get-variable -scope 0


      이 명령을 다음과 같이 축약할 수 있습니다.


    gv -s 0


      이 명령은 스크립트에 정의한 변수와 디버깅 중에 정의한 변수만 보는 경우에 유용합니다.


  명령줄에서 디버깅
      변수 중단점이나 명령 중단점을 설정할 때는 스크립트 파일에만 중단점을 설정할 수 있습니다. 그러나 
      기본적으로 중단점은 현재 세션에서 실행하는 모든 항목에 설정됩니다. 


      예를 들어 $name 변수에 중단점을 설정하면 중단점을 해제하거나 제거할 때까지 실행하는 모든 스크립트, 
      명령, 함수, 스크립트 cmdlet 또는 식의 $name 변수에서 디버거가 중단됩니다.


      스크립트가 세션과 사용자 프로필에서 함수, 변수 및 다른 스크립트의 영향을 받을 수 있는 보다 현실적인 
      컨텍스트에서 스크립트를 디버깅할 수 있습니다.


      줄 중단점은 스크립트 파일에 한정되므로 스크립트 파일에만 설정됩니다. 


  함수 디버깅
      Begin, Process 및 End 섹션이 있는 함수에 중단점을 설정하면 디버거는 각 섹션의 첫 번째 줄에서 
      중단됩니다.


      예를 들면 다음과 같습니다.


              function test-cmdlet
              {
                  begin
                  {
                      write-output "Begin"
                  }
                  Process
                  {
                      write-output "Process"
                  }
                  end
                  {
                      write-output "End"
                  }
              }
        
          C:\PS> set-psbreakpoint -command test-cmdlet

          C:\PS> test-cmdlet
    
          Begin
          디버그 모드로 들어갑니다. 도움말을 보려면 h 또는 ?를 사용하십시오.

          'prompt:test-cmdlet'의 명령 중단점 적중

          test-cmdlet

          [DBG]: C:\PS> c
          Process
          디버그 모드로 들어갑니다. 도움말을 보려면 h 또는 ?를 사용하십시오.

          'prompt:test-cmdlet'의 명령 중단점 적중

          test-cmdlet

          [DBG]: C:\PS> c
          End
          디버그 모드로 들어갑니다. 도움말을 보려면 h 또는 ?를 사용하십시오.

          'prompt:test-cmdlet'의 명령 중단점 적중

          test-cmdlet

          [DBG]: C:\PS> 


  원격 스크립트 디버깅
      원격 세션에서는 Windows PowerShell 디버거를 실행할 수 없습니다. 원격 컴퓨터에서 스크립트를 
      디버그하려면 로컬 컴퓨터로 스크립트를 복사하십시오.


      다음 명령은 Server01 원격 컴퓨터에서 로컬 컴퓨터로 Test.ps1 스크립트를 복사합니다. 


          invoke-command -computername Server01 ` {get-content 
          c:\ps-test\test.ps1} | set-location c:\ps-test\test.ps1


  예
      이 테스트 스크립트는 운영 체제의 버전을 감지하고 시스템에 적합한 메시지를 표시합니다. 이 
      스크립트에는 함수, 함수 호출 및 변수가 포함됩니다. 


      다음 명령은 테스트 스크립트 파일의 내용을 표시합니다.

    
      c:>\PS-test> get-content test.ps1


      function psversion {
             "Windows Powershell " + $psversiontable.psversion
              if ($psversiontable.psversion.major -lt 2) {
                  "Upgrade to Windows PowerShell 2.0!"
              }
              else {
                  "Have you run a background job today (start-job)?"
              }
          }

      $scriptname = $MyInvocation.MyCommand.Path
      psversion
      "Done $scriptname."


      시작하려면 줄, 명령, 변수, 함수 등의 스크립트에서 해당 점에 중단점을 설정합니다.
 

      먼저 현재 디렉터리에서 Test.ps1 스크립트의 첫 번째 줄에 줄 중단점을 만듭니다.


          PS C:\ps-test> set-psbreakpoint -line 1 -script test.ps1 


      이 명령을 다음과 같이 축약할 수 있습니다.


          PS C:\ps-test> spb 1 -s test.ps1

        
      이 명령은 줄 중단점 개체(System.Management.Automation.LineBreakpoint)를 반환합니다.


        Column     : 0
            Line       : 1
            Action     :
            Enabled    : True
            HitCount   : 0
            Id         : 0
            Script     : C:\ps-test\test.ps1
            ScriptName : C:\ps-test\test.ps1
    

      이제 스크립트를 시작합니다.


      PS C:\ps-test> .\test.ps1


      스크립트가 첫 번째 중단점에 도달하면 디버거가 활성 상태임을 나타내는 중단점 메시지가 나타납니다. 
      이 메시지는 중단점을 설명하고 함수 선언인 스크립트의 첫 번째 줄을 미리 보여 줍니다. 명령 
      프롬프트도 디버거에 제어가 있음을 표시하도록 변경됩니다.


      미리 보기 줄에는 스크립트 이름과 미리 보는 명령의 줄 번호가 포함됩니다.


          디버그 모드로 들어갑니다. 도움말을 보려면 h 또는 ?를 사용하십시오.

          'C:\ps-test\test.ps1:1'의 줄 중단점 적중

          test.ps1:1  function psversion {
          DBG>


      Step 명령(s)을 사용하여 스크립트의 첫 번째 문을 실행하고 다음 문을 미리 봅니다. 다음 문은 
      $MyInvocation 자동 변수를 사용하여 $ScriptName 변수 값을 스크립트 파일의 경로와 파일 이름으로 
      설정합니다.


          DBG> s
          test.ps1:11 $scriptname = $MyInvocation.MyCommand.Path


      이 시점에 $ScriptName 변수는 채워지지 않지만 값을 표시하여 변수 값을 확인할 수 있습니다. 이 경우 
      값은 $null입니다.


          DBG> $scriptname
          DBG>

    
      또 다른 Step 명령(s)을 사용하여 현재 문을 실행하고 스크립트의 다음 문을 미리 봅니다. 다음 문은 
      PsVersion 함수를 호출합니다.


      DBG> s
      test.ps1:12 psversion


      이 시점에 $ScriptName 변수가 채워지지만 값을 표시하여 변수 값을 확인합니다. 이 경우 값은 스크립트 
      경로로 설정됩니다.


          DBG> $scriptname
          C:\ps-test\test.ps1
   

      또 다른 Step 명령을 사용하여 함수 호출을 실행합니다. Enter 키를 누르거나 Step을 실행하려면 "s"를 
      입력하십시오.


      DBG> s
      test.ps1:2       "Windows Powershell " + $psversiontable.p
      sversion


      디버그 메시지에는 함수에 있는 문의 미리 보기가 포함됩니다. 이 문을 실행하고 함수의 다음 문을 미리 
      보려면 Step 명령을 사용할 수 있습니다. 그러나 이 경우에는 Step-Out 명령(o)을 사용합니다. 그러면 함수 
      실행이 완료되고(중단점에 도달하지 않은 경우) 스크립트의 다음 문으로 진행됩니다.


      DBG> o
      Windows Powershell 2.0
      Have you run a background job today (start-job)?
      test.ps1:13 "Done $scriptname."


      스크립트의 마지막 문에 있으므로 Step, Step-Out 및 Continue 명령은 동일한 효과를 나타냅니다. 이 
      경우에는 Step-Out(o)을 사용합니다. 


      Done C:\ps-test\test.ps1
      PS C:\ps-test>


      Step-Out 명령은 마지막 명령을 실행합니다. 표준 명령 프롬프트는 디버거가 종료되고 명령 
      프로세서로 제어를 전환했음을 나타냅니다.


      이제 디버거를 다시 실행합니다. 먼저 현재 중단점을 삭제하려면 Get-PsBreakpoint 및 Remove-
      PsBreakpoint cmdlet을 사용합니다.
      중단점을 다시 사용할 수 있는 경우 Remove-PsBreakpoint 대신 Disable-PsBreakpoint 
      cmdlet을 사용합니다.


      PS C:\ps-test> Get-PsBreakpoint | Remove-PSBreakpoint


      이 명령을 다음과 같이 축약할 수 있습니다.


      PS C:\ps-test> gbp | rbp


      또는 다음 함수와 같은 함수를 작성하여 명령을 실행합니다.


      function delbr { gbp | rbp }


      이제 $scriptname 변수에 중단점을 만듭니다. 


      PS C:\ps-test> set-psbreakpoint -variable scriptname -script test.ps1


      이 명령을 다음과 같이 축약할 수 있습니다. 


      PS C:\ps-test> sbp -v scriptname -s test.ps1


      이제 스크립트를 시작합니다. 스크립트가 변수 중단점에 도달합니다. 기본 모드는 Write이므로 변수 
      값을 변경하는 문 바로 앞에서 실행이 중지됩니다.


      PS C:\ps-test> .\test.ps1
      'C:\ps-test\test.ps1:$scriptname'(쓰기 액세스)의 변수 중단점 적중

      test.ps1:11  $scriptname = $MyInvocation.mycommand.path
      DBG> 


      $scriptname 변수의 현재 값($null)을 표시합니다.


          DBG> $scriptname
          DBG>

      Step 명령(s)를 사용하여 변수를 채우는 문을 실행합니다. 그런 다음 $scriptname 변수의 새 값을 
      표시합니다.


      DBG> $scriptname
      C:\ps-test\test.ps1


      Step 명령(s)을 사용하여 스크립트의 다음 문을 미리 봅니다.


      DBG> s
      test.ps1:12 psversion

   
      다음 문은 PsVersion 함수에 대한 호출입니다. 함수를 건너뛰면서 그대로 실행하려면 Step-Over 
      명령(v)을 사용합니다. Step-Over를 사용할 때 이미 함수에 있는 경우 이 명령은 아무 효과도 
      없습니다. 함수 호출이 표시되지만 실행되지 않습니다.

    
      DBG> v
      Windows Powershell 2.0
      Have you run a background job today (start-job)?
      test.ps1:13 "Done $scriptname."  


      Step-Over 명령은 함수를 실행하고 마지막 줄을 인쇄하는 스크립트의 다음 문을 미리 봅니다.


      Stop 명령(t)을 사용하여 디버거를 종료합니다. 명령 프롬프트는 표준 명령 프롬프트로 돌아갑니다.


      C:\ps-test>


      중단점을 삭제하려면 Get-PsBreakpoint 및 Remove-PsBreakpoint cmdlet을 사용합니다.


      PS C:\ps-test> Get-PsBreakpoint | Remove-PSBreakpoint


      PsVersion 함수에 새 명령 중단점을 만듭니다.


          PS C:\ps-test> Set-PsBreakpoint -command psversion -script test.ps1 


      이 명령을 다음과 같이 축약할 수 있습니다.


          PS C:\ps-test> sbp -c psversion -s test.ps1 


      이제 스크립트를 실행합니다.   


          PS C:\ps-test> .\test.ps1
          'C:\ps-test\test.ps1:psversion'의 명령 중단점 적중

          test.ps1:12 psversion
          DBG>


      스크립트는 함수 호출에서 중단점에 도달합니다. 이 시점에서는 함수가 아직 호출되지 않았습니다. 
      따라서 Set-PsBreakpoint의Action 매개 변수를 사용하여 중단점 실행 조건을 설정하거나 준비 
      또는 진단 작업(예: 로그 시작이나 진단 또는 보안 스크립트 호출)을 수행할 기회가 있습니다.


      작업을 설정하려면 Continue 명령(c)을 사용하여 스크립트를 종료하고 Remove-PsBreakpoint 명령을 
      사용하여 현재 중단점을 삭제합니다. 중단점은 읽기 전용이므로 현재 중단점에 작업을 추가할 수 
      없습니다.


      DBG> c
      Windows PowerShell 2.0
      Have you run a background job today (start-job)?
      Done C:\ps-test\test.ps1

      PS C:\ps-test> get-psbreakpoint | remove-psbreakpoint
      PS C:\ps-test>


      이제 작업으로 새 명령 중단점을 만듭니다. 다음 명령은 함수가 호출될 때 $scriptname 변수 값을 
      기록하는 작업을 사용하여 명령 중단점을 설정합니다. Break 키워드가 작업에 사용되지 않으므로 
      실행이 중지되지 않습니다. 억음 기호(`)는 줄 연속 문자입니다.


         PS C:\ps-test> set-psbreakpoint -command psversion -script test.ps1  `
         -action { add-content "The value of `$scriptname is $scriptname." `
         -path action.log}


      중단점에 대한 조건을 설정하는 작업을 추가할 수도 있습니다. 다음 명령에서는 실행 정책이 
      RemoteSigned(스크립트 실행을 허용하는 가장 제한적인 정책)로 설정된 경우에만 명령 중단점이 
      실행됩니다. 억음 기호(`)는 연속 문자입니다.  


          PS C:\ps-test> set-psbreakpoint -script test.ps1 -command psversion `
          -action { if ((get-executionpolicy) -eq "RemoteSigned") { break }}


      작업에서 Break 키워드를 사용하면 디버거에서 중단점이 실행됩니다. Continue 키워드를 사용하여 
      디버거가 중단 없이 실행되도록 설정할 수도 있습니다. 기본 키워드는 Continue이므로 Break를 
      지정하여 실행을 중지해야 합니다.


      이제 스크립트를 실행합니다.


      PS C:\ps-test> .\test.ps1
      'C:\ps-test\test.ps1:psversion'의 명령 중단점 적중

      test.ps1:12 psversion

    
      실행 정책이 RemoteSigned으로 설정되었으므로 함수 호출에서 실행이 중지됩니다. 


      이 시점에서 호출 스택을 확인해야 할 수 있습니다. Get-PsCallStack cmdlet 또는 Get-
      PsCallStack 디버거 명령(k)을 사용합니다.
      다음 명령은 현재 호출 스택을 가져옵니다.


      DBG> k
      2: prompt
      1: .\test.ps1: $args=[]
      0: prompt: $args=[]


      이 예에서는 Windows PowerShell 디버거를 사용하는 여러 방법 중 몇 가지만 보여 줍니다. 


      디버거 cmdlet에 대한 자세한 내용을 보려면 다음 명령을 입력하십시오.


          help <cmdlet-name> -full


      예를 들어 다음과 같이 입력하십시오.


          help set-psbreakpoint -full


참고 항목
    Disable-PsBreakpoint
    Get-PsBreakpoint  
    Remove-PsBreakpoint
    Set-PsBreakpoint 
    Set-PsDebug
    Set-Strictmode
    Write-Debug
    Write-Verbose  
    Enable-PsBreakpoint
    Get-PsCallStack