about_Debuggers

Rövid leírás

A PowerShell hibakeresőjének leírása.

Hosszú leírás

A hibakeresés a szkriptek vizsgálatának folyamata, miközben fut a szkript utasításainak hibáinak azonosítása és javítása. A PowerShell hibakeresője segíthet a szkriptek, függvények, parancsok, PowerShell kívánt állapotkonfigurációk vagy kifejezések hibáinak és hatékonysági hibáinak vizsgálatában és azonosításában.

A PowerShell 5.0-tól kezdve a PowerShell-hibakeresőt frissítettük a távoli számítógépeken futó szkriptek, függvények, parancsok, konfigurációk vagy kifejezések hibakeresésére, amelyek a konzolon vagy a Windows PowerShell integrált szkriptelési környezetében (I Standard kiadás) futnak.

Feljegyzés

A Windows PowerShell I Standard kiadás csak a Windows PowerShellt támogatja. A PowerShell 6-os és újabb verzióihoz a Visual Studio Code-ot kell használnia a PowerShell bővítményével. További információ: Hibakeresés a Visual Studio Code-tal.

Hibakereső parancsmagok

A PowerShell-hibakereső a következő parancsmagokat tartalmazza:

  • Set-PSBreakpoint: Töréspontokat állít be vonalakon, változókon és parancsokon.
  • Get-PSBreakpoint: Töréspontokat kap az aktuális munkamenetben.
  • Disable-PSBreakpoint: Kikapcsolja a töréspontokat az aktuális munkamenetben.
  • Enable-PSBreakpoint: Újra engedélyezi a töréspontokat az aktuális munkamenetben.
  • Remove-PSBreakpoint: Törli a töréspontokat az aktuális munkamenetből.
  • Get-PSCallStack: Az aktuális hívásverem megjelenítése.

A hibakereső indítása és leállítása

A hibakereső elindításához állítson be egy vagy több töréspontot, majd futtassa a hibakereséshez használni kívánt szkriptet, parancsot vagy függvényt.

Amikor eléri a töréspontot, a végrehajtás leáll, és a vezérlő át lesz kapcsolva a hibakeresőre.

A hibakereső leállításához futtassa a szkriptet, a parancsot vagy a függvényt, amíg be nem fejeződik. Vagy írja be stop vagy t.

Hibakereső parancsok

Ha a Hibakeresőt a PowerShell-konzolon használja, az alábbi parancsokkal szabályozhatja a végrehajtást. A Windows PowerShell I Standard kiadás-ban használja a Hibakeresés menü parancsait.

Feljegyzés

A hibakereső más gazdagépalkalmazásokban való használatáról a gazdagépalkalmazás dokumentációjában tájékozódhat.

  • s, StepInto: Végrehajtja a következő utasítást, majd leáll.

  • v, StepOver: Végrehajtja a következő utasítást, de kihagyja a függvényeket és a hívásokat. A kihagyott utasítások végrehajtása, de nem léptethető át.

  • Ctrl+Break: (Az összes megszakítása az I-ben Standard kiadás) A PowerShell-konzolon vagy a Windows PowerShell I Standard kiadás futó szkriptre törik. Vegye figyelembe, hogy + a Windows PowerShell 2.0-s, 3.0-s és 4.0-s billentyűkombinációja bezárja a programot. A Break All helyi és távoli, interaktívan futó szkripteken is működik.

  • o, StepOut: Lépés az aktuális függvényből; beágyazás esetén egy szinttel feljebb. Ha a törzsben továbbra is a végéig vagy a következő töréspontig tart. A kihagyott utasítások végrehajtása, de nem léptethető át.

  • c, Continue: A szkript befejezéséig vagy a következő töréspont eléréséig fut. A kihagyott utasítások végrehajtása, de nem léptethető át.

  • l, : ListMegjeleníti a szkript végrehajtó részét. Alapértelmezés szerint az aktuális sort, öt előző sort és 10 további sort jeleníti meg. A szkript listázásának folytatásához nyomja le az ENTER billentyűt.

  • l <m>, : ListA szkript 16 sorát jeleníti meg a megadott sorszámmal <m>kezdődően.

  • l <m> <n>, List: Megjeleníti <n> a szkript sorait, kezdve a megadott <m>sorszámmal.

  • q, , StopExit: Leállítja a szkript végrehajtását, és kilép a hibakeresőből. Ha a parancsmag futtatásával Debug-Job hibakeresést végez egy feladaton, a Exit parancs leválasztja a hibakeresőt, és engedélyezi a feladat futtatását.

  • k, : Get-PsCallStackAz aktuális hívásverem megjelenítése.

  • <Enter>: Megismétli az utolsó parancsot, ha az (), (v) vagy List (l) volt Step . StepOvers Ellenkező esetben küldési műveletet jelöl.

  • ?, : hMegjeleníti a hibakereső parancs súgóját.

A hibakeresőből való kilépéshez használhatja Stop (q).

A PowerShell 5.0-tól kezdve a Kilépés parancs futtatásával kiléphet egy beágyazott hibakeresési munkamenetből, amelyet vagy Debug-JobDebug-Runspacea .

Ezekkel a hibakereső parancsokkal futtathat egy szkriptet, leállhat egy problémás ponton, megvizsgálhatja a változók értékeit és a rendszer állapotát, és folytathatja a szkript futtatását, amíg nem talált problémát.

Feljegyzés

Ha átirányítási operátorral lép be egy utasításba, például >a PowerShell hibakeresője a szkriptben lévő összes többi utasításra lép.

Szkriptváltozók értékeinek megjelenítése

Miközben a hibakeresőben van, parancsokat is megadhat, megjelenítheti a változók értékét, parancsmagokat használhat, és szkripteket futtathat a parancssorban. A hibakeresés alatt álló szkriptben az összes változó aktuális értékét megjelenítheti, kivéve az alábbi automatikus változókat:

$_
$Args
$Input
$MyInvocation
$PSBoundParameters

A változók bármelyikének megjelenítésekor a változó értékét egy belső folyamathoz kapja meg, amelyet a hibakereső használ, nem pedig a szkriptben lévő változó értékét.

Ha meg szeretné jeleníteni a hibakeresés alatt álló szkript ezen változóinak értékét, adjon hozzá sorokat a szkripthez, hogy ezeket az értékeket egy új változóba mentse. Állítsa be a töréspontot az új sorok után. Ezután megjelenítheti az új változó értékét.

Például:

$scriptArgs = $Args
$scriptname = $MyInvocation.PSCommandPath

A hibakereső környezet

Amikor eléri a töréspontot, beírja a hibakereső környezetet. A parancssor úgy változik, hogy a következővel kezdődjön: "[DBG]:". Egyes gazdagépalkalmazásokban, például a PowerShell-konzolon is megnyílik egy beágyazott kérés a hibakereséshez. A beágyazott parancssort a parancssorban megjelenő ismétlődő nagyobb karakterek (ASCII 62) segítségével észlelheti.

A parancssor testreszabásával kapcsolatos további információkért lásd : about_Prompts.

A beágyazási szintet az $NestedPromptLevel automatikus változóval találja meg. Az automatikus változó $PSDebugContexta helyi hatókörben van definiálva. A változó jelenlétével meghatározhatja $PSDebugContext , hogy a hibakeresőn belül fut-e.

Példa:

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

A hibakeresésben használhatja a $PSDebugContext változó értékét.

[DBG]: PS>>> $PSDebugContext.InvocationInfo

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

Hibakeresés és hatókör

A hibakeresőbe való betörés nem változtatja meg azt a hatókört, amelyben működik, de amikor egy szkript töréspontjához ér, a szkript hatókörébe lép. A szkript hatóköre annak a hatókörnek a gyermeke, amelyben a hibakeresőt futtatta.

A szkript hatókörében definiált változók és aliasok megkereséséhez használja a Get-AliasGet-Variable parancsmagok Hatókör paraméterét.

A következő parancs például lekéri a változókat a helyi (szkript) hatókörben:

Get-Variable -scope 0

Ez hasznos módja annak, hogy csak a szkriptben definiált és a hibakeresés során definiált változókat láthassa.

Hibakeresés a parancssorban

Változó töréspont vagy parancstörési pont beállításakor a töréspontot csak szkriptfájlban állíthatja be. Alapértelmezés szerint azonban a töréspont mindenre be van állítva, amely az aktuális munkamenetben fut.

Ha például töréspontot állít be a $name változón, a hibakereső megszakítja a $name töréspont letiltásáig vagy eltávolításáig futtatott szkriptek, parancsok, függvények, szkript parancsmagok vagy kifejezések bármely változóját.

Ez lehetővé teszi a szkriptek hibakeresését egy reálisabb környezetben, amelyben a munkamenetben és a felhasználói profilban lévő függvények, változók és egyéb szkriptek hatással lehetnek rájuk.

A sortörési pontok a szkriptfájlokra vonatkoznak, ezért csak szkriptfájlokban vannak beállítva.

Hibakeresési függvények

Amikor töréspontot állít be egy olyan függvényen, amelynek begin, processés end szakaszai vannak, a hibakereső az egyes szakaszok első sorában törik meg.

Példa:

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
Entering debug mode. Use h or ? for help.

Hit Command breakpoint on 'prompt:test-cmdlet'

test-cmdlet

[DBG]: C:\PS> c
Process
Entering debug mode. Use h or ? for help.

Hit Command breakpoint on 'prompt:test-cmdlet'

test-cmdlet

[DBG]: C:\PS> c
End
Entering debug mode. Use h or ? for help.

Hit Command breakpoint on 'prompt:test-cmdlet'

test-cmdlet

[DBG]: C:\PS>

Távoli szkriptek hibakeresése

Futtathat Enter-PSSession egy interaktív távoli PowerShell-munkamenetet, amelyben töréspontokat állíthat be, és szkriptfájlokat és parancsokat hibakereséssel végezhet a távoli számítógépen. Enter-PSSession lehetővé teszi egy távoli számítógépen parancsfájlt vagy parancsot futtató leválasztott munkamenet újracsatlakoztatását. Ha a futó szkript töréspontot ér el, az ügyfél munkamenete automatikusan elindítja a hibakeresőt. Ha a szkriptet futtató leválasztott munkamenet már elérte a töréspontot, Enter-PSSession automatikusan elindítja a parancssori hibakeresőt, amikor újra csatlakozik a munkamenethez.

Az alábbi példa bemutatja ennek működését. A töréspontok a szkript 6., 11., 22. és 25. sorában lettek beállítva. A hibakereső indításakor a parancssor két azonosító módosítást hajt végre:

  • Annak a számítógépnek a neve, amelyen a munkamenet fut
  • A hibakeresési módban lévő adatbázis-kezelő üzenet
Enter-PSSession -Cn localhost
[localhost]: PS C:\psscripts> Set-PSBreakpoint .\ttest19.ps1 6,11,22,25

ID Script          Line     Command          Variable          Action
-- ------          ----     -------          --------          ------
0 ttest19.ps1          6
1 ttest19.ps1          11
2 ttest19.ps1          22
3 ttest19.ps1          25

[localhost]: PS C:\psscripts> .\ttest19.ps1
Hit Line breakpoint on 'C:\psscripts\ttest19.ps1:11'

At C:\psscripts\ttest19.ps1:11 char:1
+ $winRMName = "WinRM"
# + ~

[localhost]: [DBG]: PS C:\psscripts>> list

6:      1..5 | foreach { sleep 1; Write-Output "hello2day $_" }
7:  }
# 8:

9:  $count = 10
10:  $psName = "PowerShell"
11:* $winRMName = "WinRM"
12:  $myVar = 102
# 13:

14:  for ($i=0; $i -lt $count; $i++)
15:  {
16:      sleep 1
17:      Write-Output "Loop iteration is: $i"
18:      Write-Output "MyVar is $myVar"
# 19:

20:      hello2day
# 21:


[localhost]: [DBG]: PS C:\psscripts>> stepover
At C:\psscripts\ttest19.ps1:12 char:1
+ $myVar = 102
# + ~

[localhost]: [DBG]: PS C:\psscripts>> quit
[localhost]: PS C:\psscripts> Exit-PSSession
PS C:\psscripts>

Példák

Ez a tesztszkript észleli a PowerShell verzióját, és megjeleníti a verziónak megfelelő üzenetet. Tartalmaz egy függvényt, egy függvényhívást és egy változót.

A következő parancs megjeleníti a tesztszkriptfájl tartalmát:

PS C:\PS-test>  Get-Content test.ps1

function psversion {
  "PowerShell " + $PSVersionTable.PSVersion
  if ($PSVersionTable.PSVersion.Major -lt 7) {
    "Upgrade to PowerShell 7!"
  }
  else {
    "Have you run a background job today (start-job)?"
  }
}

$scriptName = $MyInvocation.PSCommandPath
psversion
"Done $scriptName."

Első lépésként állítson be egy töréspontot a szkript érdeklődési pontjára, például egy sorra, parancsra, változóra vagy függvényre.

Először hozzon létre egy sortörési pontot a Test.ps1 szkript első sorában az aktuális könyvtárban.

PS C:\ps-test> Set-PSBreakpoint -line 1 -script test.ps1

A parancs egy System.Management.Automation.LineBreakpoint objektumot ad vissza.

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

Most indítsa el a szkriptet.

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

Amikor a szkript eléri az első töréspontot, a töréspont üzenet azt jelzi, hogy a hibakereső aktív. Leírja a töréspontot, és a szkript első sorát tekinti meg, amely egy függvénydeklaráció. A parancssor azt is jelzi, hogy a hibakereső rendelkezik vezérléssel.

Az előnézeti sor tartalmazza a szkript nevét és az előnézeti parancs sorszámát.

Entering debug mode. Use h or ? for help.

Hit Line breakpoint on 'C:\ps-test\test.ps1:1'

test.ps1:1   function psversion {
DBG>

A Lépés paranccsal végrehajthatja az első utasítást a szkriptben, és megtekintheti a következő utasítás előnézetét. A következő utasítás az $MyInvocation automatikus változóval állítja be a $scriptName változó értékét a szkriptfájl elérési útjára és fájlnevére.

DBG> s
test.ps1:11  $scriptName = $MyInvocation.PSCommandPath

Ezen a ponton a $scriptName változó nincs feltöltve, de az értékének megjelenítésével ellenőrizheti a változó értékét. Ebben az esetben az érték .$null

DBG> $scriptname
DBG>

Egy másik Step paranccsal (s) végrehajthatja az aktuális utasítást, és megtekintheti a szkript következő utasítását. A következő utasítás meghívja a függvényt psversion .

DBG> s
test.ps1:12  psversion

Ezen a ponton a $scriptName változó ki van töltve, de az értékének megjelenítésével ellenőrzi a változó értékét. Ebben az esetben az érték a szkript elérési útjára van állítva.

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

A függvényhívás végrehajtásához használjon egy másik lépésparancsot. Nyomja le az ENTER billentyűt, vagy írja be az "s" szót a lépéshez.

DBG> s
test.ps1:2       "PowerShell " + $PSVersionTable.PSVersion

A hibakeresési üzenet tartalmazza a függvény utasításának előnézetét. Az utasítás végrehajtásához és a függvény következő utasításának előnézetéhez használhat egy parancsot Step . Ebben az esetben azonban használja a StepOut parancsot (o). Befejezi a függvény végrehajtását (hacsak nem éri el a töréspontot), és végrehajtja a szkript következő utasításának lépéseit.

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

Mivel a szkript utolsó utasításán vagyunk, a Step, StepOut és Continue parancsok hatása megegyezik. Ebben az esetben használja a StepOut (o) elemet.

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

A StepOut parancs végrehajtja az utolsó parancsot. A szabványos parancssor azt jelzi, hogy a hibakereső kilépett, és visszaadta a vezérlőt a parancsfeldolgozónak.

Most futtassa újra a hibakeresőt. Először az aktuális töréspont törléséhez használja a parancsmagokat és Remove-PsBreakpoint a Get-PsBreakpoint parancsmagokat. (Ha úgy gondolja, hogy újra felhasználhatja a töréspontot, használja a Disable-PsBreakpoint parancsmagot a Remove-PsBreakpoint.)

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

Ezt a parancsot a következőképpen rövidítheti:

PS C:\ps-test> gbp | rbp

Vagy futtassa a parancsot egy függvény megírásával, például a következő függvénnyel:

function delbr { gbp | rbp }

Most hozzon létre egy töréspontot a $scriptname változón.

PS C:\ps-test> Set-PSBreakpoint -variable scriptname -script test.ps1

A parancs rövidítése a következő:

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

Most indítsa el a szkriptet. A szkript eléri a változó töréspontját. Az alapértelmezett mód az Írás, így a végrehajtás közvetlenül a változó értékét módosító utasítás előtt leáll.

PS C:\ps-test> .\test.ps1
Hit Variable breakpoint on 'C:\ps-test\test.ps1:$scriptName'
(Write access)

test.ps1:11  $scriptName = $MyInvocation.PSCommandPath
DBG>

A változó aktuális értékének $scriptName megjelenítése, amely a $nullkövetkező: .

DBG> $scriptName
DBG>

A változót kitöltő utasítás végrehajtásához használjon egy Step parancsot (s). Ezután jelenítse meg a változó új értékét $scriptName .

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

A parancs (ok) használatával megtekintheti a szkript következő utasítását.

DBG> s
test.ps1:12  psversion

A következő utasítás a függvény hívása psversion . Ha ki szeretné hagyni a függvényt, de mégis végrehajtja, használjon egy StepOver parancsot (v). Ha már használatban van a függvényben StepOver, az nem hatékony. Megjelenik a függvényhívás, de nincs végrehajtva.

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

A StepOver parancs végrehajtja a függvényt, és megjeleníti a szkript következő utasítását, amely kinyomtatja az utolsó sort.

Stop Egy parancs (t) használatával lépjen ki a hibakeresőből. A parancssor visszaáll a szabványos parancssorra.

C:\ps-test>

A töréspontok törléséhez használja a parancsmagokat és Remove-PsBreakpoint a Get-PsBreakpoint parancsmagokat.

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

Hozzon létre egy új parancstörési pontot a psversion függvényen.

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

Ezt a parancsot a következőre rövidítheti:

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

Most futtassa a szkriptet.

PS C:\ps-test> .\test.ps1
Hit Command breakpoint on 'C:\ps-test\test.ps1:psversion'

test.ps1:12  psversion
DBG>

A szkript a függvényhíváskor eléri a töréspontot. Ezen a ponton a függvény még nem lett meghívva. Ez lehetővé teszi, hogy a Műveleti paraméterrel Set-PSBreakpoint feltételeket állítson be a töréspont végrehajtásához, vagy előkészítő vagy diagnosztikai feladatokat hajtson végre, például naplót indíthat, vagy diagnosztikai vagy biztonsági szkripteket invoktálhat.

Művelet beállításához használja a Folytatás parancsot (c) a szkriptből való kilépéshez, és egy Remove-PsBreakpoint parancsot az aktuális töréspont törléséhez. (A töréspontok írásvédettek, ezért nem adhat hozzá műveletet az aktuális törésponthoz.)

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>

Most hozzon létre egy új parancstörési pontot egy művelettel. Az alábbi parancs beállít egy parancstörési pontot egy olyan művelettel, amely naplózza a $scriptName változó értékét a függvény meghívásakor. Mivel a break kulcsszó nem szerepel a műveletben, a végrehajtás nem áll le. A backtick (`) a vonal-folytatás karakter.

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

Olyan műveleteket is hozzáadhat, amelyek feltételeket határoznak meg a törésponthoz. A következő parancsban a parancs töréspontja csak akkor lesz végrehajtva, ha a végrehajtási szabályzat RemoteSigned értékre van állítva, amely a legkorlátozóbb szabályzat, amely továbbra is lehetővé teszi szkriptek futtatását.

PS C:\ps-test> Set-PSBreakpoint -script test.ps1 -command psversion `
-action { if ((Get-ExecutionPolicy) -eq "RemoteSigned") { break }}

A break művelet kulcsszója a hibakeresőt a töréspont végrehajtására irányítja. A kulcsszóval continue a hibakeresőt megszakítás nélkül is végrehajthatja. Mivel az alapértelmezett kulcsszó, continuemeg kell adnia break a végrehajtás leállítását.

Most futtassa a szkriptet.

PS C:\ps-test> .\test.ps1
Hit Command breakpoint on 'C:\ps-test\test.ps1:psversion'

test.ps1:12  psversion

Mivel a végrehajtási szabályzat RemoteSigned értékre van állítva, a végrehajtás leáll a függvényhívásnál.

Ezen a ponton érdemes lehet ellenőrizni a hívás vermet. Használja a Get-PsCallStack parancsmagot vagy a Get-PsCallStack hibakereső parancsot (k). Az alábbi parancs lekéri az aktuális hívási vermet.

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

Ez a példa csupán néhányat mutat be a PowerShell-hibakereső használatának számos módja közül.

A PowerShell egyéb hibakeresési funkciói

A PowerShell hibakeresője mellett a PowerShell számos egyéb funkciót is tartalmaz, amelyekkel szkripteket és függvényeket hibakeresésre használhat.

  • A Set-PSDebug parancsmag nagyon egyszerű szkript hibakeresési funkciókat kínál, beleértve a léptetést és a nyomkövetést.

  • A parancsmaggal azonosíthatja a Set-StrictMode nem nem inicializált változókra mutató hivatkozásokat, az objektumok nem létező tulajdonságaira mutató hivatkozásokat, valamint az érvénytelen függvényszintaxisokat.

  • Adjon hozzá diagnosztikai utasításokat egy szkripthez, például a változók értékét megjelenítő utasításokat, a parancssorból beolvasott utasításokat vagy az aktuális utasítást jelentéskészítő utasításokat. Használja azokat a parancsmagokat, amelyek a feladat írási parancsmagjait tartalmazzák, például Write-Host: , Write-Debug, Write-Warningés Write-Verbose.

Lásd még