Skip to content

Debugger hangs when displaying certain variables #708

Open
@powercode

Description

@powercode

Steps to reproduce:

class X  {
	[string] ToString() {return $this.AMethod()}
	[string] AMethod() { return "XXX AMethod" }

        # this works if ToString is changed to the code below
	#[string] ToString() {return "xxx"}
}

class Z {
	[X] $X = [X]::new()
}

$z = [Z]::new()
$z

Put a breakpoint on the last line and try to view $z in the debugger.

The thing that breaks is invoking a member method (static or instance) while evaluating ToString().
Accessing properties in ToString works fine, however.

It seems to be connected to events (PSEngineEvent.OnScriptBlockInvoke) being raised while an event is being processed. Not sure if this is a supported scenario. @BrucePay do you know the intention here?

Possibly related is also this code in scriptblock.cs:

            ExecutionContext context = LocalPipeline.GetExecutionContextFromTLS();

            if (SessionStateInternal != null && SessionStateInternal.ExecutionContext != context)
            {
                context = SessionStateInternal.ExecutionContext;
                shouldGenerateEvent = true;
            }

shouldGenerateEvent is set to true if SessionStateInternal.ExecutionContext != LocalPipeline.GetExecutionContextFromTLS() .

shouldGenerateEvent is what causes the invocation of PSEngineEvent.OnScriptBlockInvoke that is hanging.

Callstack

 	System.Private.CoreLib.dll!System.Threading.ManualResetEventSlim.Wait(int = 0x000000fa, System.Threading.CancellationToken)	Unknown	No symbols loaded.
 	System.Private.CoreLib.dll!System.Threading.ManualResetEventSlim.Wait(int)	Unknown	No symbols loaded.
>	System.Management.Automation.dll!System.Management.Automation.PSLocalEventManager.ProcessNewEvent(System.Management.Automation.PSEventArgs, bool, bool = true)	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.ScriptBlock.InvokeWithPipe(bool, System.Management.Automation.ScriptBlock.ErrorHandlingBehavior, object, object, object, System.Management.Automation.Internal.Pipe, System.Management.Automation.InvocationInfo, bool, System.Collections.Generic.List<System.Management.Automation.PSVariable>, System.Collections.Generic.Dictionary<string, System.Management.Automation.ScriptBlock>, object[])	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.ScriptBlock.InvokeAsMemberFunctionT<string>(object, object[])	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.Internal.ScriptBlockMemberMethodWrapper.InvokeHelperT<string>(object, object, object[])	Unknown	No symbols loaded.
 	[Lightweight Function]		Annotated Frame
 	System.Linq.Expressions.dll!System.Dynamic.UpdateDelegates.UpdateAndExecute1<object, object>(System.Runtime.CompilerServices.CallSite = {System.Runtime.CompilerServices.CallSite<System.Func<System.Runtime.CompilerServices.CallSite, object, object>>}, object = {X})	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.Interpreter.DynamicInstruction<object, object>.Run(System.Management.Automation.Interpreter.InterpretedFrame)	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(System.Management.Automation.Interpreter.InterpretedFrame = {System.Management.Automation.Interpreter.InterpretedFrame})	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(System.Management.Automation.Interpreter.InterpretedFrame = {System.Management.Automation.Interpreter.InterpretedFrame})	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.Interpreter.Interpreter.Run(System.Management.Automation.Interpreter.InterpretedFrame = {System.Management.Automation.Interpreter.InterpretedFrame})	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.Interpreter.LightLambda.RunVoid1<System.Management.Automation.Language.FunctionContext>(System.Management.Automation.Language.FunctionContext)	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.ScriptBlock.InvokeWithPipeImpl(System.Management.Automation.ScriptBlockClauseToInvoke, bool = true, System.Collections.Generic.Dictionary<string, System.Management.Automation.ScriptBlock>, System.Collections.Generic.List<System.Management.Automation.PSVariable>, System.Management.Automation.ScriptBlock.ErrorHandlingBehavior, object, object, object, System.Management.Automation.Internal.Pipe, System.Management.Automation.InvocationInfo, object[])	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.ScriptBlock.OnScriptBlockInvokeEventHandler(object, System.Management.Automation.PSEventArgs)	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.PSLocalEventManager.InvokeAction(System.Management.Automation.EventAction = {System.Management.Automation.EventAction}, out bool = false)	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.PSLocalEventManager.ProcessPendingActionsImpl()	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.PSLocalEventManager.ProcessNewEvent(System.Management.Automation.PSEventArgs, bool, bool = true)	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.ScriptBlock.InvokeWithPipe(bool, System.Management.Automation.ScriptBlock.ErrorHandlingBehavior, object, object, object, System.Management.Automation.Internal.Pipe, System.Management.Automation.InvocationInfo, bool, System.Collections.Generic.List<System.Management.Automation.PSVariable>, System.Collections.Generic.Dictionary<string, System.Management.Automation.ScriptBlock>, object[])	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.ScriptBlock.InvokeAsMemberFunctionT<string>(object, object[])	Unknown	No symbols loaded.
 	System.Management.Automation.dll!System.Management.Automation.Internal.ScriptBlockMemberMethodWrapper.InvokeHelperT<string>(object, object, object[])	Unknown	No symbols loaded.
 	Microsoft.PowerShell.EditorServices.dll!Microsoft.PowerShell.EditorServices.Utility.ObjectExtensions.SafeToString(object)	Unknown	No symbols loaded.
 	Microsoft.PowerShell.EditorServices.dll!Microsoft.PowerShell.EditorServices.VariableDetails.GetValueStringAndType(object = {X}, bool, out string)	Unknown	No symbols loaded.
 	Microsoft.PowerShell.EditorServices.dll!Microsoft.PowerShell.EditorServices.VariableDetails.VariableDetails(string, object)	Unknown	No symbols loaded.
 	Microsoft.PowerShell.EditorServices.dll!Microsoft.PowerShell.EditorServices.VariableDetails.AddDotNetProperties(object = {Z}, System.Collections.Generic.List<Microsoft.PowerShell.EditorServices.VariableDetails> = Count = 0x00000000)	Unknown	No symbols loaded.
 	Microsoft.PowerShell.EditorServices.dll!Microsoft.PowerShell.EditorServices.VariableDetails.GetChildren(object, Microsoft.PowerShell.EditorServices.Utility.ILogger = {Microsoft.PowerShell.EditorServices.Utility.PsesLogger})	Unknown	No symbols loaded.
 	Microsoft.PowerShell.EditorServices.dll!Microsoft.PowerShell.EditorServices.VariableDetails.GetChildren(Microsoft.PowerShell.EditorServices.Utility.ILogger)	Unknown	No symbols loaded.
 	Microsoft.PowerShell.EditorServices.dll!Microsoft.PowerShell.EditorServices.DebugService.GetVariables(int)	Unknown	No symbols loaded.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions