Note: This tip requires PowerShell 4.0 or above.
In this great post, Tobias walked you through the process of hiding functions from the debugger. In this tip, I want to show a dynamic way of doing the same, a way that doesn’t require access to the function code if for any reason you cannot decorate a function with the mentioned attribute. Here goes…
Starting in Windows 4.0 script blocks have a new property: DebuggerHidden.
PS> ${function:test}|gm d* TypeName: System.Management.Automation.ScriptBlock Name MemberType Definition ---- ---------- ---------- DebuggerHidden Property bool DebuggerHidden {get;set;}
You can get its value to determine if a function is hidden from the debugger but more importantly, you can set its value and instruct the debugger to skip the function. Let’s create a function and try to debug it. Put the following code in a script file and save it (debugging works only for saved scripts).
1 |
<a href="http://104.131.21.239/wp-content/uploads/2013/08/DebuggerHidden1.png"><img class="alignnone size-full wp-image-7696" alt="DebuggerHidden1" src="http://104.131.21.239/wp-content/uploads/2013/08/DebuggerHidden1.png" width="227" height="141" /></a> |
Now move your cursor to the function call (line 6) and press F9 to place a new breakpoint. Press F5 to execute the script and then start pressing F11 to step into the code, you’ll see that you’re the debugger steps into the function body and it is executed line by line until eventually you get the return value of the function.
Now let’s set ask debugger to ignore and “step over” the function:
1 |
<a href="http://104.131.21.239/wp-content/uploads/2013/08/DebuggerHidden2.png"><img class="alignnone size-full wp-image-7697" alt="DebuggerHidden2" src="http://104.131.21.239/wp-content/uploads/2013/08/DebuggerHidden2.png" /></a> |
Repeat the debugging process described earlier. Notice that now, when you press the F11 key, the debugger “ignores” the function and you immediately get the result.