获取远程会话堆栈跟踪

时间:2018-11-29 19:35:20

标签: powershell

如何获取在远程计算机上引发的异常的堆栈跟踪?

This question几乎相同,但是询问者对获得SerializedRemoteInvocationInfo.PositionMessage感到满意。我的情况有多个相互调用的脚本,因此我需要完整的调用堆栈才能了解我的问题。

以下代码段显示了一个空的堆栈跟踪:

$session = New-PSSession -ComputerName AComputer -UseSSL
$script = {C:\AScriptThatFails.ps1}
try{
    Invoke-Command -Session $session -ScriptBlock $script
}
catch{
    Write-Output = $_.Exception.SerializedRemoteException.StackTrace #Empty!?
}

1 个答案:

答案 0 :(得分:1)

看起来错误记录的.ScriptStackTrace属性包含远程脚本执行的堆栈跟踪:

try {
  Invoke-Command -ErrorAction Stop -Session $session -ScriptBlock $script
}
catch {
  $_                    # output the error record
  $_.ScriptStackTrace   # output the script stack trace
}

请注意使用-ErrorAction Stop将远程错误升级为脚本终止错误,以便try / catch处理程序由 any 错误触发,不仅通过脚本终止的错误(即通过非终止和声明终止的错误)。

如果不希望这种升级,请使用以下技术:

$hadScriptTerminatingError = $false
try {
  # User -ErrorVariable to collect the errors that occur.
  Invoke-Command -Session $session -ScriptBlock $script -ErrorVariable errs
} catch { $hadScriptTerminatingError = $true }
$succeeded = $? -and -not $hadScriptTerminatingError

# Analyze the collected errors, if any.
foreach ($err in $errs) {
  $err                   # output the error record
  $err.ScriptStackTrace  # output the script stack trace
}