Can I get detailed exception stacktrace in PowerShell?

前端 未结 12 1152
暗喜
暗喜 2020-12-02 12:23

Runing such script:

 1: function foo()
 2: {
 3:    bar
 4: }
 5: 
 6: function bar()
 7: {
 8:     throw \"test\"
 9: }
10: 
11: foo

I see

12条回答
  •  囚心锁ツ
    2020-12-02 12:45

    There are cases where PowerShell doesn't seem to keep a backtrace, like calling a method or calling a function with .Invoke(). For that, Set-PSDebug -Trace 2 may come in handy. It will print every executed line of the running script.

    Try flipping # on (1) and (2) and running WrapStackTraceLog({ function f{ 1/0 } ; & f }) # let's divide by zero

    Function WrapStackTraceLog($func) {
        try {
            # return $func.Invoke($args)  # (1)
            return (& $func $args)  # (2)
        } catch {
            Write-Host ('=' * 70)
            Write-Host $_.Exception.Message
            Write-Host ('-' * 70)
            Write-Host $_.ScriptStackTrace
            Write-Host ('-' * 70)
            Write-Host "$StackTrace"
            Write-Host ('=' * 70)
        }
    }
    

    Branch (1) exception caught:

    Exception calling "Invoke" with "1" argument(s): "Attempted to divide by zero."
    

    Branch (2) is more informative:

    at f, : line 1
    at , : line 1
    at global:WrapStackTraceLog, : line 4
    at , : line 1
    

    But, you can still trace your Invokes with tracing on, branch (1):

    DEBUG:     ! CALL function 'f'
    DEBUG:    1+ WrapStackTraceLog({ function f{  >>>> 1/0 } ; & f })
    DEBUG:    6+          >>>> Write-Host ('=' * 70)
    ======================================================================
    DEBUG:    7+          >>>> Write-Host $_.Exception.Message
    Exception calling "Invoke" with "1" argument(s): "Attempted to divide by zero."
    

提交回复
热议问题