Sei sulla pagina 1di 13

TEMA

about_Debuggers
DESCRIPCIN BREVE
Describe el depurador de Windows PowerShell.
DESCRIPCIN DETALLADA
Depurar es el proceso de examinar un script mientras se ejecuta a
fin de identificar y corregir errores que pueda haber en las
instrucciones del script. El depurador de Windows PowerShell se
ha diseado para ayudarle a examinar e identifica errores e
ineficacias en los scripts.

Nota: el depurador de Windows PowerShell no se ejecuta remotamente.
Para depurar un script en un equipo remoto, copie el
script en el equipo local.
Las caractersticas del depurador de Windows PowerShell se pueden
utilizar para examinar un script, una funcin, un comando o una
expresin de Windows PowerShell mientras se est ejecutando. El
depurador de Windows PowerShell incluye un conjunto de cmdlets
que permiten establecer y administrar puntos de interrupcin, as
como ver la pila de llamadas.

Windows PowerShell proporciona varios mtodos que se pueden
utilizar para depurar el script, las funciones y los comandos.
Mtodo 1: el cmdlet Set-PsDebug proporciona caractersticas de
depuracin de script bsicas, como la ejecucin paso a paso y el
seguimiento. Para obtener ms informacin, escriba:
"get-help set-psdebug".
Mtodo 2: el cmdlet Set-StrictMode se utiliza para detectar las
referencias a las variables no inicializadas o a propiedades no
existentes de un objeto, as como sintaxis de funciones no vlida.
Mtodo 3: se pueden agregar instrucciones de diagnstico a un
script, como las que muestran el valor de las variables, las que
leen la entrada de la lnea de comandos o las que informan de
cul es la instruccin actual. Para esta tarea se utilizan los
cmdlets que contienen el verbo Write, tales como Write-Host,
Write-Debug, Write-Warning y Write-Verbose.
Mtodo 4: el depurador de Windows PowerShell se utiliza para depurar un
script. Tambin puede utilizarse para depurar una funcin o un
bloque de script que se ha escrito en el smbolo del sistema.
Es posible establecer puntos de interrupcin, ejecutar el script
paso a paso, examinar los valores de las variables, ejecutar los
comandos de diagnstico y registro, y mostrar la pila de llamadas.

Cmdlets del depurador
El depurador de Windows PowerShell incluye el conjunto siguiente de
cmdlets:
Set-PsBreakpoint: establece puntos de interrupcin en las
lneas, las variables y los comandos.
Get-PsBreakpoint: obtiene los puntos de interrupcin de
la sesin actual.
Disable-PsBreakpoint: desactiva los puntos de interrupcin de la
sesin actual.
Enable-PsBreakpoint: vuelve a habilitar todos los puntos de
interrupcin de la sesin actual.
Remove-PsBreakpoint: elimina todos los puntos de
interrupcin de la sesin actual.
Get-PsCallStack: muestra la pila de llamadas actual.
Iniciar y detener el depurador
Para iniciar el depurador, establezca uno o ms puntos de
interrupcin. A continuacin, ejecute el script, el comando o
la funcin que desee depurar.
Al llegar a un punto de interrupcin, la ejecucin se detiene y
se entrega el control al depurador.
Para detener el depurador, ejecute el script, el comando o la
funcin hasta que haya finalizado. O bien, escriba "stop" o "t".

Comandos del depurador
Cuando se utiliza el depurador en la consola de Windows
PowerShell, los comandos siguientes permiten controlar la ejecucin.

Nota: para obtener informacin sobre cmo utilizar el depurador
en otras aplicaciones host, consulte la documentacin de la
aplicacin host.
s, Step-into Ejecuta la prxima instruccin y, a
continuacin, se detiene.
v, Step-over Ejecuta la prxima instruccin, pero omite funciones e
invocaciones. Las instrucciones omitidas se ejecutan
,
pero no paso a paso.
o, Step-out Recorre la funcin actual paso a paso para salir; sube
un
nivel si est anidada. Si est en el cuerpo principal,
contina hasta el final o hasta el prximo punto de inte
rrupcin.
Las instrucciones omitidas se ejecutan, pero no paso
a paso.
c, Continue Contina ejecutndose hasta que el script haya finalizad
o
o hasta que se alcance el prximo punto de interrupcin.

Las instrucciones omitidas se ejecutan, pero no paso
a paso.
l, List Muestra la parte del script que se est ejecutando. De
forma
predeterminada, muestra la lnea actual, cinco lneas an
teriores
y 10 lneas subsiguientes. Para seguir mostrando el sc
ript,
presione ENTRAR.

l <m>, List Muestra 16 lneas del script, empezando por el nmero de

lnea especificado por <m>.
l <m> <n>, List Muestra <n> lneas del script, empezando por el nmero d
e
lnea especificado por <m>.
q, Stop Detiene la ejecucin del script y sale del depurador.
k, Get-PsCallStack Muestra la pila de llamadas actual.
<Enter> Repite el ltimo comando si era Step (s), Step-over (v
)
o List (l). De lo contrario, representa una accin de
envo.

?, h Muestra la Ayuda de comandos del depurador.
Para salir del depurador, se utiliza Stop (q).
Desde el propio depurador tambin es posible escribir comandos,
mostrar el valor de las variables, usar cmdlets y ejecutar scripts.
Con estos comandos del depurador, es posible ejecutar un
script, detenerse en un punto complicado, estudiar los valores
de las variables y el estado del sistema, y seguir ejecutando
el script hasta identificar un problema.
Entorno del depurador
Al llegar a un punto de interrupcin, se entra en el entorno
del depurador. El smbolo del sistema cambia y comienza por
"[DBG]:". El smbolo del sistema se puede personalizar.

Adems, en algunas aplicaciones host, como la consola de Windows
PowerShell, (pero no en el entorno de scripting integrado de Windows
PowerShell [ISE]) se abre un smbolo del sistema anidado para llevar
a cabo la depuracin. Puede detectar que se trata de un smbolo del
sistema anidado por los caracteres de mayor que (ASCII 62) seguidos
que aparecen en el smbolo del sistema.
Por ejemplo, a continuacin se muestra el smbolo del sistema de
depuracin predeterminado en la consola de Windows PowerShell:
[DBG]: PS (get-location)>>>
El nivel de anidamiento se puede buscar mediante la variable
automtica $NestedPromptLevel.
Adems, se define una variable automtica, $ PSDebugContext, en
el mbito local. La presencia de la variable $PsDebugContext se
puede usar para determinar si la ejecucin se est realizando en el
depurador.
Por ejemplo:

if ($psdebugcontext) {"Depurando"} else {"No depurando"}
El valor de la variable $PSDebugContext se puede usar al depurar.
[DBG]: PS>>> $psdebugcontext.invocationinfo
Nombre CommandLineParameters UnboundArguments Ubicacin
---- --------------------- ---------------- --------
= {} {} C:\ps-test\vote.ps1 (1
)
Depuracin y mbito
Al efectuar una interrupcin que pasa el control al depurador, no se
cambia el mbito en el que se opera; sin embargo, cuando se alcanza
un punto de interrupcin en un script, se pasa al mbito del script.
El mbito del script es un elemento secundario del mbito en el que
se ejecut el depurador.
Para buscar las variables y los alias definidos en el mbito
del script, se utiliza el parmetro Scope de los cmdlets
Get-Alias o Get-Variable.
Por ejemplo, el comando siguiente obtiene las variables del
mbito local (script):
get-variable -scope 0
Este comando puede abreviarse como sigue:
gv -s 0
Se trata de una manera til de ver nicamente las variables que
se han definido en el script y durante la depuracin.
Depurar en la lnea de comandos
Cuando se establece un punto de interrupcin de variable o de
comando, el punto de interrupcin solamente se puede establecer
en un archivo de script. Sin embargo, de forma predeterminada,
el punto de interrupcin se establece en cualquier cosa que se
ejecute en la sesin actual.
Por ejemplo, si establece un punto de interrupcin en la
variable $name, el depurador lleva a cabo la interrupcin en
cualquier variable $name de cualquier script, comando, funcin,
cmdlet de script o expresin que se ejecute hasta que se
deshabilite o quite el punto de interrupcin.
Esto permite depurar los scripts en un contexto ms realista,
donde les pueden afectar funciones, variables y otros scripts
de la sesin y del perfil del usuario.
Los puntos de interrupcin de lnea son especficos de los
archivos de script, de modo que solamente se establecen en
estos archivos.
Depurar funciones
Cuando se establece un punto de interrupcin en una funcin que
tiene secciones Begin, Process y End, el depurador realiza la
interrupcin en la primera lnea de cada seccin.
Por ejemplo:
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
Entrando en modo de depuracin. Use h o ? para obtener ayuda.
Alcanzar Punto de interrupcin de comando en 'prompt:test-cm
dlet'
test-cmdlet
[DBG]: C:\PS> c
Process
Entrando en modo de depuracin. Use h o ? para obtener ayuda.
Alcanzar Punto de interrupcin de comando en 'prompt:test-cm
dlet'
test-cmdlet
[DBG]: C:\PS> c
End
Entrando en modo de depuracin. Use h o ? para obtener ayuda.
Alcanzar Punto de interrupcin de comando en 'prompt:test-cm
dlet'
test-cmdlet
[DBG]: C:\PS>
Depurar scripts remotos
El depurador de Windows PowerShell no se puede ejecutar en una
sesin remota. Para depurar un script en un equipo remoto,
copie el script en el equipo local.
El comando siguiente copia el script Test.ps1 del equipo remoto
Server01 en el equipo local:
invoke-command -computername Server01 ` {get-content
c:\ps-test\test.ps1} | set-location c:\ps-test\test.ps1
Ejemplos
Este script de prueba detecta la versin del sistema operativo
y muestra el mensaje apropiado para el sistema. Incluye una
funcin, una llamada a una funcin y una variable.
El comando siguiente muestra el contenido del archivo de script
de pruebas:
c:>\PS-test> get-content test.ps1
function psversion {
"Windows PowerShell " + $psversiontable.psversion
if ($psversiontable.psversion.major -lt 2) {
"Debe actualizarse a Windows PowerShell 2.0"
}
else {
"Ha ejecutado hoy un trabajo de segundo plano (start-job)?"
}
}
$scriptname = $MyInvocation.MyCommand.Path
psversion
"$scriptname finalizado."
Para comenzar, establezca un punto de interrupcin en un punto
de inters del script, como una lnea, un comando, una variable
o una funcin.

Empiece creando un punto de interrupcin de lnea en la primera
lnea del script Test.ps1 del directorio actual.
PS C:\ps-test> set-psbreakpoint -line 1 -script test.ps1
Este comando puede abreviarse como sigue:
PS C:\ps-test> spb 1 -s test.ps1

El comando devuelve un objeto del punto de interrupcin de lnea
(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
Ahora, inicie el script.
PS C:\ps-test> .\test.ps1
Cuando el script alcanza el primer punto de interrupcin, el
mensaje de punto de interrupcin indica que el depurador est
activo. Describe el punto de interrupcin y ofrece una vista
previa de la primera lnea del script, que es una declaracin
de funcin. El smbolo del sistema tambin cambia para indicar
que el depurador tiene el control.
La lnea de vista previa incluye el nombre del script y el
nmero de lnea del comando cuya vista previa se muestra.
Entrando en modo de depuracin. Use h o ? para obtener ayuda.
Alcanzar Punto de interrupcin de lnea en 'C:\ps-test\test.
ps1:1'
test.ps1:1 function psversion {
DBG>
Utilice el comando Step (s) para ejecutar la primera instruccin del
script y mostrar una vista previa de la prxima instruccin. En la
instruccin siguiente se utiliza la variable automtica $MyInvocation
para establecer el valor de la variable &ScriptName en la ruta de acceso y

el nombre del archivo de script.
DBG> s
test.ps1:11 $scriptname = $MyInvocation.MyCommand.Path
En este punto, la variable $ScriptName no contiene ningn
valor, pero se puede comprobar el valor de la variable
mostrndolo. En este caso, el valor es $null.
DBG> $scriptname
DBG>

Utilice otro comando Step (s) para ejecutar la instruccin actual y
mostrar una vista previa de la prxima instruccin del script. La
instruccin siguiente llama a la funcin PsVersion.
DBG> s
test.ps1:12 psversion
En este punto, la variable $ScriptName contiene un valor, pero
se puede comprobar el valor de la variable mostrndolo. En este
caso, el valor est establecido en la ruta de acceso del script.
DBG> $scriptname
C:\ps-test\test.ps1

Utilice otro comando Step para ejecutar la llamada a la
funcin. Presione ENTRAR o escriba "s" en lugar de Step.
DBG> s
test.ps1:2 "Windows PowerShell " + $psversiontable.psversion
El mensaje de depuracin incluye una vista previa de la
instruccin en la funcin.
Para ejecutar esta instruccin y mostrar una vista previa de la
prxima instruccin de la funcin, se puede utilizar un comando
Step. Sin embargo, en este caso, utilice el comando Step-Out (o).
Completa la ejecucin de la funcin (a menos que alcance un punto
de interrupcin) y pasa a la prxima instruccin del script.
DBG> o
Windows PowerShell 2.0
Ha ejecutado hoy un trabajo de segundo plano (start-job)?
test.ps1:13 "$scriptname finalizado"
Dado que nos encontramos en la ltima instruccin del script,
los comandos Step, Step-Out y Continue tienen el mismo efecto.
En este caso, utilice Step-Out (o).
C:\ps-test\test.ps1 finalizado
PS C:\ps-test>
El comando Step-Out ejecuta el ltimo comando. El smbolo del
sistema estndar indica que el depurador se ha cerrado y ha
devuelto el control al procesador de comandos.
Ahora, ejecute el depurador de nuevo. Primero, para eliminar el
punto de interrupcin actual, utilice los cmdlets Get-PsBreakpoint y
Remove-PsBreakpoint.
(Si piensa que es posible reutilizar el punto de interrupcin,
utilice el cmdlet Disable-PsBreakpoint en lugar de
Remove-PsBreakpoint.)
PS C:\ps-test> Get-PsBreakpoint | Remove-PSBreakpoint
Este comando puede abreviarse como sigue:
PS C:\ps-test> gbp | rbp
Otra posibilidad es ejecutar el comando escribiendo una
funcin, como la siguiente:
function delbr { gbp | rbp }
Ahora, cree un punto de interrupcin en la variable $scriptname.
PS C:\ps-test> set-psbreakpoint -variable scriptname -script test.ps1
Este comando puede abreviarse como sigue:
PS C:\ps-test> sbp -v scriptname -s test.ps1
Ahora, inicie el script. El script alcanza el punto de
interrupcin de variable. El modo predeterminado es Write, as
que la ejecucin se detiene justo delante de la instruccin que
cambia el valor de la variable.
PS C:\ps-test> .\test.ps1
Alcanzar Punto de interrupcin variable en
'C:\ps-test\test.ps1:$scriptname' (acceso Write)
test.ps1:11 $scriptname = $MyInvocation.mycommand.path
DBG>
Muestre el valor actual de la variable $scriptname, que es $null.
DBG> $scriptname
DBG>
Utilice un comando Step (s) para ejecutar la instruccin
contenida en la variable. A continuacin, muestre el nuevo
valor de la variable $scriptname.
DBG> $scriptname
C:\ps-test\test.ps1
Utilice un comando Step (s) para mostrar una vista previa de la
prxima instruccin del script.
DBG> s
test.ps1:12 psversion

La prxima instruccin es una llamada a la funcin PsVersion.
Para omitir la funcin pero ejecutarla, utilice un comando
Step-Over (v). Si ya se encuentra en la funcin cuando utilice
Step-Over, no surtir efecto. Se muestra la llamada a la
funcin, pero no se ejecuta.
DBG> v
Windows PowerShell 2.0
Ha ejecutado hoy un trabajo de segundo plano (start-job)?
test.ps1:13 "$scriptname finalizado"
El comando Step-Over ejecuta la funcin y muestra una vista
previa de la prxima instruccin del script, que imprime la
lnea final.
Utilice un comando Stop (t) para salir del depurador. El smbolo del
sistema regresa al smbolo del sistema estndar.
C:\ps-test>
Para eliminar los puntos de interrupcin, utilice los cmdlets
Get-PsBreakpoint y Remove-PsBreakpoint.
PS C:\ps-test> Get-PsBreakpoint | Remove-PSBreakpoint
Cree un nuevo punto de interrupcin de comando en la funcin PsVersion.
PS C:\ps-test> Set-PsBreakpoint -command psversion -script test.ps1
Este comando puede abreviarse como sigue:
PS C:\ps-test> sbp -c psversion -s test.ps1
Ahora, ejecute el script.
PS C:\ps-test> .\test.ps1
Alcanzar Punto de interrupcin de comando en 'C:\ps-test\test.ps1:psvers
ion'
test.ps1:12 psversion
DBG>
El script alcanza el punto de interrupcin en la llamada a la
funcin. En este punto, todava no se ha llamado a la funcin.
Esto le permite utilizar el parmetro Action de Set-PsBreakpoint
a fin de establecer las condiciones para la ejecucin del punto de
interrupcin o realizar tareas de preparacin o diagnstico, tales
como iniciar un registro o invocar un script de diagnstico o de
seguridad.
Para establecer una accin, utilice un comando Continue (c)
para salir del script y un comando Remove-PsBreakpoint para
eliminar el punto de interrupcin actual. (Los puntos de
interrupcin son de solo lectura, de modo que no se puede
agregar una accin al punto de interrupcin actual.)
DBG> c
Windows PowerShell 2.0
Ha ejecutado hoy un trabajo de segundo plano (start-job)?
C:\ps-test\test.ps1 finalizado
PS C:\ps-test> get-psbreakpoint | remove-psbreakpoint
PS C:\ps-test>
Ahora, cree un nuevo punto de interrupcin de comando con una
accin. El comando siguiente establece un punto de interrupcin
de comando con una accin que registra el valor de la variable
$scriptname cuando se llama a la funcin. Dado que la palabra
clave Break no se utiliza en la accin, la ejecucin no se
detiene. (El carcter de acento grave [`] es el carcter de
continuacin de lnea.)
PS C:\ps-test> set-psbreakpoint -command psversion -script test.ps1 `
-action { add-content "El valor de `$scriptname es $scriptname."
` path action.log}
Tambin puede agregar acciones que establezcan condiciones para
el punto de interrupcin. En el comando siguiente, el punto de
interrupcin de comando se ejecuta solamente si la directiva de
ejecucin se establece en RemoteSigned, la directiva ms restrictiva
que permite ejecutar scripts. (El carcter de acento grave [`] es el
carcter de continuacin.)
PS C:\ps-test> set-psbreakpoint -script test.ps1 -command psversion `
-action { if ((get-executionpolicy) -eq "RemoteSigned") { break }}
La palabra clave Break en la accin dirige el depurador para
que ejecute el punto de interrupcin. Tambin puede utilizar la
palabra clave Continue si desea dirigir el depurador para que
se ejecute sin interrupciones. Dado que la palabra clave
predeterminada es Continue, debe especificar Break si desea
detener la ejecucin.
Ahora, ejecute el script.
PS C:\ps-test> .\test.ps1
Alcanzar Punto de interrupcin de comando en 'C:\ps-test\test.ps1:psvers
ion'
test.ps1:12 psversion

Dado que la directiva de ejecucin se ha establecido en
RemoteSigned, la ejecucin se detiene en la llamada a la funcin.
En este punto, puede ser interesante comprobar la pila de llamadas.
Utilice el cmdlet Get-PsCallStack o el comando Get-PsCallStack (k)
del depurador.
El comando siguiente obtiene la pila de llamadas actual.
DBG> k
2: prompt
1: .\test.ps1: $args=[]
0: prompt: $args=[]
En este ejemplo se muestran tan solo algunas de las maneras de
utilizar el depurador de Windows PowerShell.
Para obtener ms informacin sobre los cmdlets del depurador,
escriba el comando siguiente:
help <nombre-del-cmdlet> -full
Por ejemplo, escriba:
help set-psbreakpoint -full
VEA TAMBIN
Disable-PsBreakpoint
Get-PsBreakpoint
Remove-PsBreakpoint
Set-PsBreakpoint
Set-PsDebug
Set-Strictmode
Write-Debug
Write-Verbose
Enable-PsBreakpoint
Get-PsCallStack

Potrebbero piacerti anche