#调试与跟踪
#简介
PowerShell 提供断点、单步调试、调试消息和内部跟踪等机制。对于无法通过阅读代码定位的问题,可以结合断点和 Trace-Command 观察命令绑定、类型转换等内部过程。
#设置断点
Set-PSBreakpoint 支持按行、命令或变量设置断点:
Set-PSBreakpoint -Script ./demo.ps1 -Line 10
Set-PSBreakpoint -Command Get-Process
Set-PSBreakpoint -Variable count -Mode Write
-Script -Line:在脚本指定行暂停。-Command:在命令执行前暂停。-Variable -Mode Write:变量被写入时暂停。
查看和删除断点:
Get-PSBreakpoint
Get-PSBreakpoint | Remove-PSBreakpoint
断点属于当前会话,关闭会话后不会保留。
#Wait-Debugger
Wait-Debugger 会在脚本执行到该位置时暂停,等待调试器继续:
function Test-Value { param([int]$Value); Wait-Debugger; $Value * 2 }
Test-Value -Value 21
在自动化或无人值守场景中应移除 Wait-Debugger,否则进程可能一直挂起。
#Set-PSDebug
Set-PSDebug 用于开启简单的脚本跟踪:
Set-PSDebug -Trace 1
./demo.ps1
Set-PSDebug -Off
-Trace 取值 0、1、2,分别表示关闭、跟踪脚本行、同时跟踪变量赋值和函数调用。-Step 逐行单步执行,-Strict 检查未初始化变量。Set-PSDebug 会显著降低执行速度,只应在排查问题时临时启用。
#Trace-Command
Trace-Command 可以跟踪 PowerShell 引擎的内部操作,例如参数绑定和类型转换:
Trace-Command -Name ParameterBinding -Expression {
Get-Process -Name pwsh
} -PSHost
常用跟踪名称包括 ParameterBinding、CommandDiscovery、TypeConversion 和 ETS。-PSHost 表示把跟踪结果输出到当前主机。
#Write-Debug
Write-Debug 向调试流写入消息,只有在调试偏好允许时才会显示:
function Invoke-Task {
[CmdletBinding()]
param([string]$Name)
Write-Debug "开始处理 $Name"
"完成:$Name"
}
Invoke-Task -Name 'demo' -Debug
也可以临时设置 $DebugPreference = 'Continue' 来显示调试消息,排查完成后改回 'SilentlyContinue'。
#调试器基本命令
进入调试器后,可以使用以下单字符命令:
s 单步进入,v 单步跳过,o 跳出,c 继续,q 停止并退出,k 显示堆栈,l 列出源码,h 或 ? 显示帮助;也可以直接输入表达式查看值。
在脚本中也可以调用 Get-PSCallStack 查看当前调用堆栈。
#注意事项
- 断点和
Set-PSDebug都是会话级状态,排查完成后应清理。 - 跟踪输出可能包含路径、变量值等敏感信息,分享日志前应检查。
Write-Debug使用调试流,不会混入正常输出流。