THEMA
about_Debuggers
KURZBESCHREIBUNG
Beschreibt den Windows PowerShell-Debugger.
DETAILBESCHREIBUNG
Als Debuggen wird die Untersuchung eines Skripts während dessen
Ausführung bezeichnet, bei der Fehler in den Skriptanweisungen
erkannt und korrigiert werden. Der Windows PowerShell-Debugger
wurde entworfen, um Ihnen das Untersuchen und Erkennen von
Fehlern und Ineffizienzen in den Skripts zu erleichtern.
Hinweis: Der Windows PowerShell-Debugger wird nicht remote
ausgeführt. Zum Debuggen eines Skripts auf einem Remotecomputer
kopieren Sie das Skript auf den lokalen Computer.
Mit den Features des Windows PowerShell-Debuggers können Sie
Windows PowerShell-Skripts, Funktionen, Befehle oder Ausdrücke
während der Ausführung untersuchen. Der Windows PowerShell-Debugger
umfasst einen Satz von Cmdlets, mit denen Sie Haltepunkte
festlegen und verwalten sowie die Aufrufliste anzeigen können.
Windows PowerShell bietet mehrere Methoden, mit denen Sie
Skripts, Funktionen und Befehle debuggen können.
Methode 1: Das Cmdlet "Set-PsDebug" bietet einfache Debugfeatures
für Skripts, z. B. Durchlaufen und Ablaufverfolgung.
Weitere Informationen erhalten Sie mit folgendem Befehl:
"get-help set-psdebug".
Methode 2: Verwenden Sie das Cmdlet "Set-StrictMode", um Verweise
auf nicht initialisierte Variablen, Verweise auf nicht
vorhandene Eigenschaften eines Objekts sowie Verweise
auf ungültige Funktionssyntax zu erkennen.
Methode 3: Fügen Sie einem Skript Diagnoseanweisungen hinzu, z. B.
Anweisungen zum Anzeigen von Variablenwerten, Anweisungen zum
Lesen der Eingabe in der Befehlszeile oder Anweisungen zum Melden
der aktuellen Anweisung. Verwenden Sie die Cmdlets, die das Verb
"Write" für diese Aufgabe enthalten, z. B. Write-Host,
Write-Debug, Write-Warning und Write-Verbose.
Methode 4: Debuggen Sie ein Skript mit dem Windows PowerShell-Debugger.
Sie können den Debugger auch zum Debuggen einer Funktion
oder eines Skriptblocks verwenden, den Sie an der Eingabeaufforder
ung eingegeben haben. Sie können Haltepunkte festlegen, das
Skript durchlaufen, die Werte von Variablen untersuchen,
Diagnosen und Protokollierungsbefehle ausführen sowie die
Aufrufliste anzeigen.
Debugger-Cmdlets
Der Windows PowerShell-Debugger umfasst den folgenden Satz von Cmdlets:
Set-PsBreakpoint: Legt Haltepunkte für Zeilen, Variablen
und Befehle fest.
Get-PsBreakpoint: Ruft Haltepunkte in der aktuellen Sitzung ab.
Disable-PsBreakpoint: Deaktiviert Haltepunkte in der
aktuellen Sitzung.
Enable-PsBreakpoint: Aktiviert Haltepunkte in der aktuellen
Sitzung erneut.
Remove-PsBreakpoint: Löscht Haltepunkte in der aktuellen
Sitzung.
Get-PsCallStack: Zeigt die aktuelle Aufrufliste an.
Starten und Beenden des Debuggers
Zum Starten des Debuggers legen Sie einen oder mehrere
Haltepunkte fest. Führen Sie dann das Skript, den Befehl oder
die Funktion für den Debugvorgang aus.
Wenn Sie einen Haltepunkt erreichen, wird die Ausführung
beendet, und die Steuerung wird an den Debugger übergeben.
Zum Beenden des Debuggers führen Sie das Skript, den Befehl oder die
Funktion vollständig aus. Sie können auch "stop" oder "t" eingeben.
Debuggerbefehle
Wenn Sie den Debugger an der Windows PowerShell-Konsole
verwenden, steuern Sie die Ausführung mit den folgenden Befehlen.
Hinweis: Informationen zum Verwenden des Debuggers in anderen
Hostanwendungen finden Sie in der Dokumentation der Hostanwendung.
s, Step-into Führt die nächste Anweisung aus und
wird dann beendet.
V, Step-over Führt die nächste Anweisung aus,
überspringt jedoch Funktionen und Aufrufe.
Die übersprungenen Anweisungen werden
ausgeführt, jedoch nicht durchlaufen.
o, Step-out Verlässt die aktuelle Funktion, setzt den
Vorgang bei Schachtelung eine Ebene höher fort.
Wird im Haupttext bis zum Ende oder zum nächsten
Haltepunkt fortgesetzt. Die übersprungenen
Anweisungen werden ausgeführt, jedoch nicht durchlaufen.
c, Continue Setzt die Ausführung fort, bis das
Skript abgeschlossen ist oder der nächste Haltepunkt erreicht
wurde. Die übersprungenen Anweisungen werden ausgeführt, jedoch
nicht durchlaufen.
l, List Zeigt den Teil des Skripts an, der
derzeit ausgeführt wird. Standardmäßig werden die aktuelle
Zeile, fünf vorangehende Zeilen und 10 nachfolgende Zeilen
angezeigt. Drücken Sie EINGABETASTE, um die Ausführung des
Skripts fortzusetzen.
l <m>, List Zeigt 16 Zeilen des Skripts an,
beginnend mit der durch <m> angegebenen Zeilennummer.
l <m> <n>, List Zeigt <n> Zeilen des Skripts an, beginnend
mit der durch <m> angegebenen Zeilennummer.
q, Stop Beendet die Skriptausführung und den Debugger.
k, Get-PsCallStack Zeigt die aktuelle Aufrufliste an.
<Eingabetaste> Wiederholt den letzten Befehl, wenn
es sich dabei um "Step (s)", "Step-over (v)" oder "List (l)"
handelte. Stellt andernfalls eine Sendeaktion dar.
?, h Zeigt den Hilfebefehl des Debuggers an.
Zum Beenden des Debuggers verwenden Sie "Stop (q)".
Im Debugger können Sie auch Befehle eingeben, den Wert von
Variablen anzeigen, Cmdlets verwenden und Skripts ausführen.
Mit diesen Debuggerbefehlen können Sie ein Skript ausführen, an
einem wichtigen Punkt anhalten, die Werte von Variablen und den
Status des Systems untersuchen sowie die Ausführung des Skripts
fortsetzen, bis Sie ein Problem erkannt haben.
Die Debuggerumgebung
Wenn Sie einen Haltepunkt erreichen, greifen Sie auf die
Debuggerumgebung zu. Die Eingabeaufforderung wird so geändert,
dass sie mit "[DBG]:" beginnt. Sie können die Eingabeaufforderung
anpassen.
In einigen Hostanwendungen, z. B. der Windows PowerShell-Konsole
(nicht jedoch in der Windows PowerShell Integrated Scripting
Environment [ISE]) wird zudem eine geschachtelte
Eingabeaufforderung zum Debuggen geöffnet. Die geschachtelte
Eingabeaufforderung erkennen Sie an den sich wiederholenden
Größer-als-Zeichen (ASCII 62), die an der Eingabeaufforderung
angezeigt werden.
Beispielsweise ist Folgendes die Standardeingabeaufforderung
für das Debuggen in der Windows PowerShell-Konsole:
[DBG]: PS (get-location)>>>
Die Schachtelungsebene finden Sie mit der automatischen
Variable "$NestedPromptLevel".
Darüber hinaus wird die automatische Variable "$PSDebugContext"
im lokalen Bereich definiert. Anhand des Vorhandenseins der
Variablen "$PsDebugContext" können Sie ermitteln, ob Sie sich
im Debugger befinden.
Beispiel:
if ($psdebugcontext) {"Debugging"} else {"Not Debugging"}
Sie können den Wert der Variablen "$PSDebugContext" beim
Debuggen verwenden.
[DBG]: PS>>> $psdebugcontext.invocationinfo
Name CommandLineParameters UnboundArguments Location
---- --------------------- ---------------- --------
= {} {} C:\ps-test\vote.ps1 (1)
Debuggen und Bereich
Der Bereich, in dem Sie arbeiten, wird durch Unterbrechen des
Debuggers nicht geändert, wenn Sie jedoch einen Haltepunkt in
einem Skript erreichen, bewegen Sie sich in den Skriptbereich.
Der Skriptbereich bildet ein untergeordnetes Element des
Bereichs, in dem Sie den Debugger ausgeführt haben.
Zum Suchen der im Skriptbereich definierten Variablen und
Aliase verwenden Sie den Scope-Parameter des Cmdlets
"Get-Alias" oder "Get-Variable".
Mit dem folgenden Befehl werden beispielsweise die Variablen im
lokalen Bereich (Skriptbereich) abgerufen:
get-variable -scope 0
Sie können den Befehl wie folgt abkürzen:
gv -s 0
Dies ist eine nützliche Möglichkeit, nur die Variablen zu
sehen, die Sie im Skript definiert haben und die Sie beim
Debuggen definiert haben.
Debuggen in der Befehlszeile
Wenn Sie einen Variablenhaltepunkt oder einen Befehlshaltepunkt
festgelegt haben, können Sie den Haltepunkt nur in einer
Skriptdatei festlegen. Der Haltepunkt wird jedoch standardmäßig
auf ein beliebiges Element festgelegt, das in der aktuellen
Sitzung ausgeführt wird.
Wenn Sie z. B. einen Haltepunkt für die Variable "$name"
festlegen, wird der Debugger bei jeder Variablen "$name" in
allen derzeit ausgeführten Skripts, Befehlen, Funktionen,
Skript-Cmdlets und Ausdrücken unterbrochen, bis Sie den
Haltepunkt deaktivieren oder entfernen.
Dadurch können Sie die Skripts in einem realistischeren Kontext
debuggen, in dem sich Funktionen, Variablen und andere Skripts
in der Sitzung und im Benutzerprofil auswirken können.
Zeilenhaltepunkte gelten nur für Skriptdateien, daher werden
diese nur in Skriptdateien festgelegt.
Debuggen von Funktionen
Wenn Sie einen Haltepunkt für eine Funktion festlegen, die die
Abschnitte "Begin", "Process" und "End" umfasst, wird der
Debugger an der ersten Zeile jedes Abschnitts unterbrochen.
Beispiel:
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
Starten von Debugmodus. Zum Aufrufen von Hilfe "h'" oder
"?" verwenden.
Erreichen von Befehlshaltepunkt in 'prompt:test-Cmdlet'
test-cmdlet
[DBG]: C:\PS> c
Process
Starten von Debugmodus. Zum Aufrufen von Hilfe "h'" oder
"?" verwenden.
Erreichen von Befehlshaltepunkt in 'prompt:test-Cmdlet'
test-cmdlet
[DBG]: C:\PS> c
End
Starten von Debugmodus. Zum Aufrufen von Hilfe "h'" oder
"?" verwenden.
Erreichen von Befehlshaltepunkt in 'prompt:test-Cmdlet'
test-cmdlet
[DBG]: C:\PS>
Debuggen von Remoteskripts
Sie können den Windows PowerShell-Debugger nicht in einer
Remotesitzung ausführen. Zum Debuggen eines Skripts auf einem
Remotecomputer kopieren Sie das Skript auf den lokalen Computer.
Mit dem folgenden Befehl wird das Skript "Test.ps1" vom
Remotecomputer "Server01" auf den lokalen Computer kopiert:
invoke-command -computername Server01 ` {get-content
c:\ps-test\test.ps1} | set-location c:\ps-test\test.ps1
Beispiele
Dieses Testskript erkennt die Version des Betriebssystems und
zeigt eine dem System entsprechende Meldung an. Es umfasst eine
Funktion, einen Funktionsaufruf und eine Variable.
Mit dem folgenden Befehl wird der Inhalt der Testskriptdatei
angezeigt:
c:>\PS-test> get-content test.ps1
function psversion {
"Windows Powershell " + $psversiontable.psversion if
($psversiontable.psversion.major -lt 2) {
"Update zu Windows PowerShell 2.0!"
}
else {
"Haben Sie heute schon einen Hintergrundauftrag
ausgeführt (start-job)?" }
}
$scriptname = $MyInvocation.MyCommand.Path
psversion
"Done $scriptname."
Legen Sie zunächst einen Haltepunkt an einem wichtigen Punkt
des Skripts fest, z. B. einer Zeile, einem Befehl, einer
Variable oder einer Funktion.
Beginnen Sie, indem Sie einen Zeilenhaltepunkt auf der ersten
Zeile des Skripts "Test.ps1" im aktuellen Verzeichnis erstellen.
PS C:\ps-test> set-psbreakpoint -line 1 -script test.ps1
Sie können diesen Befehl wie folgt abkürzen:
PS C:\ps-test> spb 1 -s test.ps1
Der Befehl gibt ein Zeilenhaltepunktobjekt (System.Management.
Automation.LineBreakpoint) zurück.
Column : 0
Line : 1
Action :
Enabled : True
HitCount : 0
Id : 0
Script : C:\ps-test\test.ps1
ScriptName : C:\ps-test\test.ps1
Starten Sie jetzt das Skript.
PS C:\ps-test> .\test.ps1
Wenn das Skript den ersten Haltepunkt erreicht, gibt die
Haltepunktmeldung an, dass der Debugger aktiv ist. Es
beschreibt den Haltepunkt und zeigt die erste Zeile des
Skripts, eine Funktionsdeklaration, als Vorschau an. Die
Eingabeaufforderung wird auch geändert, um anzugeben, dass die
Steuerung beim Debugger liegt.
Die Vorschauzeile umfasst den Skriptnamen und die Zeilennummer
des in der Vorschau angezeigten Befehls.
Starten von Debugmodus. Zum Aufrufen von Hilfe "h'" oder
"?" verwenden.
Zeilenhaltepunkt für 'C:\ps-test\test.ps1: 1' erreicht
test.ps1:1 function psversion {
DBG>
Verwenden Sie den Befehl "Step" (s), um die erste Anweisung im
Skript auszuführen und die nächste Anweisung als Vorschau
anzuzeigen. In der nächsten Anweisung wird die automatische
Variable "$MyInvocation" verwendet, um den Wert der Variablen
"$ScriptName" auf den Pfad und Dateinamen der Skriptdatei
festzulegen.
DBG> s
test.ps1:11 $scriptname = $MyInvocation.MyCommand.Path
Zu diesem Zeitpunkt wird die Variable "$ScriptName" nicht
aufgefüllt, doch können Sie den Wert der Variablen überprüfen,
indem Sie deren Wert anzeigen. In diesem Fall ist der Wert $null.
DBG> $scriptname
DBG>
Verwenden Sie einen anderen Befehl "Step" (s), um die aktuelle
Anweisung auszuführen und die nächste Anweisung im Skript als
Vorschau anzuzeigen. Mit der nächsten Anweisung wird die
Funktion " PsVersion" aufgerufen.
DBG> s
test.ps1:12 psversion
Zu diesem Zeitpunkt wird die Variable "$ScriptName" aufgefüllt,
doch überprüfen Sie den Wert der Variablen, indem Sie deren
Wert anzeigen. In diesem Fall wird der Wert auf den Skriptpfad
festgelegt.
DBG> $scriptname
C:\ps-test\test.ps1
Verwenden Sie einen anderen Befehl "Step", um den Funktionsaufruf
auszuführen. Drücken Sie EINGABETASTE, oder geben Sie "s" für Step ein.
DBG> s
test.ps1:2 "Windows PowerShell " + $psversiontable.psversion
Die Debugmeldung enthält eine Vorschau der Anweisung in der Funktion.
Zum Ausführen dieser Anweisung und Anzeigen der nächsten
Anweisung in der Funktion als Vorschau können Sie den Befehl "Step"
verwenden. Verwenden Sie in diesem Fall jedoch den Befehl "Step-Out" (o).
Dieser schließt die Ausführung der Funktion ab (sofern kein
Haltepunkt erreicht wird) und springt zur nächsten Anweisung im Skript.
DBG> o
Windows Powershell 2.0
Haben Sie heute schon einen Hintergrundauftrag ausgeführt (start-job)?
test.ps1:13 "Done $scriptname"
Da Sie sich bei der letzten Anweisung im Skript befinden, haben
die Befehle "Step", "Step-Out" und "Continue" die gleiche
Auswirkung. Verwenden Sie in diesem Fall Step-Out (o).
Done C:\ps-test\test.ps1
PS C:\ps-test>
Mit dem Befehl "Step-Out" wird der letzte Befehl ausgeführt.
Die Standardeingabeaufforderung gibt an, dass der Debugger
beendet wurde und die Steuerung an den Befehlsprozessor
zurückgegeben hat.
Führen Sie den Debugger jetzt erneut aus. Verwenden Sie zuerst,
um den aktuellen Haltepunkt zu löschen, die Cmdlets
"Get-PsBreakpoint" und "Remove-PsBreakpoint".
(Wenn Sie den Haltepunkt möglicherweise wiederverwenden
möchten, verwenden Sie statt Remove-PsBreakpoint das Cmdlet
"Disable-PsBreakpoint".)
PS C:\ps-test> Get-PsBreakpoint | Remove-PSBreakpoint
Sie können diesen Befehl wie folgt abkürzen:
PS C:\ps-test> gbp | rbp
Sie können den Befehl durch Schreiben einer Funktion ausführen,
beispielsweise der folgenden:
function delbr { gbp | rbp }
Erstellen Sie nun einen Haltepunkt für die Variable "$scriptname".
PS C:\ps-test> set-psbreakpoint -variable Skriptname -script test.ps1
Sie können den Befehl wie folgt abkürzen:
PS C:\ps-test> sbp -v Skriptname -s test.ps1
Starten Sie jetzt das Skript. Das Skript erreicht den
Variablenhaltepunkt. Der Standardmodus ist "Write", daher wird
die Ausführung genau vor der Anweisung beendet, von der der
Wert der Variablen geändert wird.
PS C:\ps-test> .\test.ps1
Erreichen von Variablenhaltepunkt bei 'C:\ps-test\test.ps1:$scriptname'
(Schreibzugriff)
test.ps1:11 $scriptname = $MyInvocation.mycommand.path
DBG>
Zeigen Sie den aktuellen Wert der Variablen "$scriptname",
$null, an.
DBG> $scriptname
DBG>
Verwenden Sie den Befehl "Step" (s), um die Anweisung
auszuführen, mit der die Variable aufgefüllt wird. Zeigen Sie
dann den neuen Wert der Variablen "$scriptname" an.
DBG> $scriptname
C:\ps-test\test.ps1
Verwenden Sie den Befehl "Step" (s), um die nächste Anweisung
im Skript als Vorschau anzuzeigen.
DBG> s
test.ps1:12 psversion
Die nächste Anweisung besteht in einem Aufruf der Funktion
"PsVersion". Wenn die Funktion übersprungen, aber dennoch
ausgeführt werden soll, verwenden Sie den Befehl "Step-Over"
(v). Wenn Sie sich bei Verwendung von Step-Over bereits in der
Funktion befinden, hat der Befehl keine Auswirkungen. Der
Funktionsaufruf wird angezeigt, jedoch nicht ausgeführt.
DBG> v
Windows Powershell 2.0
Haben Sie heute schon einen Hintergrundauftrag ausgeführt (start-job)?
test.ps1:13 "Done $scriptname"
Mit dem Befehl "Step-Over" wird die Funktion ausgeführt und die
nächste Anweisung im Skript, mit dem die letzte Zeile gedruckt
wird, als Vorschau angezeigt.
Beenden Sie den Debugger mit dem Befehl "Stop" (t). Die
Eingabeaufforderung wird auf die Standardanzeige zurückgesetzt.
C:\ps-test>
Zum Löschen der Haltepunkte verwenden Sie die Cmdlets
"Get-PsBreakpoint" und "Remove-PsBreakpoint".
PS C:\ps-test> Get-PsBreakpoint | Remove-PSBreakpoint
Erstellen Sie für die Funktion "PsVersion" einen neuen
Befehlshaltepunkt.
PS C:\ps-test> Set-PsBreakpoint -command psversion -script test.ps1
Sie können diesen Befehl wie folgt abkürzen:
PS C:\ps-test> sbp -c psversion -s test.ps1
Führen Sie jetzt das Skript aus.
PS C:\ps-test> .\test.ps1
Erreichen von Befehlshaltepunkt bei 'C:\ps-test\test.ps1:psversion'
test.ps1:12 psversion
DBG>
Das Skript erreicht den Haltepunkt beim Funktionsaufruf. Zu diesem
Zeitpunkt wurde die Funktion noch nicht aufgerufen. Dies gibt Ihnen
die Gelegenheit, mit dem Action-Parameter "Set-PsBreakpoint"
Bedingungen für die Ausführung des Haltepunkts festzulegen oder
vorbereitende oder Diagnoseaufgaben auszuführen, z. B. ein Protokoll
zu starten oder eine Diagnose oder ein Sicherheitsskript aufzurufen.
Zum Festlegen einer Aktion verwenden Sie den Befehl "Continue"
(c), um das Skript zu beenden, und den Befehl "Remove-PsBreakpoint",
um den aktuellen Haltepunkt zu löschen. (Haltepunkte sind
schreibgeschützt, deshalb können Sie dem aktuellen Haltepunkt
keine Aktion hinzufügen.)
DBG> c
Windows PowerShell 2.0
Haben Sie heute schon einen Hintergrundauftrag ausgeführt (start-job)?
Done C:\ps-test\test.ps1
PS C:\ps-test> get-psbreakpoint | remove-psbreakpoint
PS C:\ps-test>
Erstellen Sie nun einen neuen Befehlshaltepunkt mit einer
Aktion. Mit dem folgenden Befehl wird einen Befehlshaltepunkt
mit einer Aktion festgelegt, die beim Aufruf der Funktion den
Wert der Variablen "$scriptname" protokolliert. Da das
Break-Schlüsselwort in der Aktion nicht verwendet wird, wird
die Ausführung nicht beendet. (Das Graviszeichen [`] wird als
Zeilenfortsetzungszeichen verwendet.)
PS C:\ps-test> set-psbreakpoint -command psversion -script test.ps1 `
-action { add-content "Der Wert von `$scriptname ist $scriptname." `
-path action.log}
Sie können auch Aktionen hinzufügen, mit denen Bedingungen für den
Haltepunkt festgelegt werden. Im folgenden Befehl wird der
Befehlshaltepunkt nur ausgeführt, wenn die Ausführungsrichtlinie
auf RemoteSigned festgelegt ist, die restriktivste Richtlinie, unter der
Sie Skripts ausführen können. (Das Graviszeichen [`]
wird als Fortsetzungszeichen verwendet.)
PS C:\ps-test> set-psbreakpoint -script test.ps1 -command psversion `
-action { if ((get-executionpolicy) -eq "RemoteSigned") { break }}
Mit dem Break-Schlüsselwort in der Aktion wird der Debugger
angewiesen, den Haltepunkt auszuführen. Mit dem Continue-Schlüssel-
wort können Sie den Debugger auch anweisen, die Ausführung
ohne Unterbrechung vorzunehmen. Da als Standardschlüsselwort
"Continue" festgelegt ist, müssen Sie Break angeben, um die
Ausführung zu beenden.
Führen Sie jetzt das Skript aus.
PS C:\ps-test> .\test.ps1
Erreichen von Befehlshaltepunkt bei 'C:\ps-test\test.ps1:psversion'
test.ps1:12 psversion
Da die Ausführungsrichtlinie auf RemoteSigned festgelegt ist,
wird die Ausführung beim Funktionsaufruf beendet.
Zu diesem Zeitpunkt möchten Sie die Aufrufliste möglicherweise
überprüfen. Verwenden Sie das Cmdlet "Get-PsCallStack" oder den
Debuggerbefehl "Get-PsCallStack" (k).
Mit dem folgenden Befehl wird die aktuelle Aufrufliste abgerufen.
DBG> k
2: prompt
1: .\test.ps1: $args=[]
0: prompt: $args=[]
In diesem Beispiel werden nur einige der zahlreichen
Verwendungsmöglichkeiten des Windows PowerShell-Debuggers
veranschaulicht.
Weitere Informationen zu den Debugger-Cmdlets erhalten Sie,
wenn Sie den folgenden Befehl eingeben:
help <Cmdlet-Name> -full
Geben Sie beispielsweise Folgendes ein:
help set-psbreakpoint -full
SIEHE AUCH
Disable-PsBreakpoint
Get-PsBreakpoint
Remove-PsBreakpoint
Set-PsBreakpoint
Set-PsDebug
Set-Strictmode
Write-Debug
Write-Verbose
Enable-PsBreakpoint
Get-PsCallStack