Debugging 确定方法正在访问的变量
我正在使用OutArgument创建一个WF程序。当我试图访问字典上的键时,我得到一个KeyNotFoundException,进程终止。我已经创建了一个失败的进程转储,下面是CLR线程堆栈。我可以在主方法框架上看到四个局部变量 如何确定主框架上的哪个局部引用了正在访问的词典?我是否必须检查所有当地人,或者是否可以从上面的框架中确定Debugging 确定方法正在访问的变量,debugging,clr,windbg,workflow-foundation-4,Debugging,Clr,Windbg,Workflow Foundation 4,我正在使用OutArgument创建一个WF程序。当我试图访问字典上的键时,我得到一个KeyNotFoundException,进程终止。我已经创建了一个失败的进程转储,下面是CLR线程堆栈。我可以在主方法框架上看到四个局部变量 如何确定主框架上的哪个局部引用了正在访问的词典?我是否必须检查所有当地人,或者是否可以从上面的框架中确定 0:000> !clrstack -a OS Thread Id: 0xf20 (0) Child SP IP Call Site 0032ebc
0:000> !clrstack -a
OS Thread Id: 0xf20 (0)
Child SP IP Call Site
0032ebc8 7742019d [HelperMethodFrame: 0032ebc8]
0032ec84 7123f326 System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].get_Item(System.__Canon)
PARAMETERS:
this = <no data>
key = <no data>
LOCALS:
<no data>
<no data>
0032ec90 00210235 UserInArgument.Program.Main(System.String[])
PARAMETERS:
args (0x0032ecec) = 0x023823dc
LOCALS:
0x0032ece8 = 0x0244a8fc
0x0032ece4 = 0x0248ba2c
0x0032ece0 = 0x023824dc
0x0032ecdc = 0x0244a8fc
0x0032ecd8 = 0x02465fb8
0:000>!clrstack-a
OS线程Id:0xf20(0)
子SP IP呼叫站点
0032ebc8 7742019d[帮助方法框架:0032ebc8]
0032ec84 7123f326系统。集合。通用。字典'2[[System.\uuuu Canon,mscorlib],[System.\uuuu Canon,mscorlib]]。获取项目(系统.\uu Canon)
参数:
这=
键=
当地人:
0032ec90 00210235 userinagrament.Program.Main(System.String[])
参数:
参数(0x0032ECC)=0x023823dc
当地人:
0x0032ece8=0x0244a8fc
0x0032ece4=0x0248ba2c
0x0032ece0=0x023824dc
0x0032ecdc=0x0244a8fc
0x0032ecd8=0x02465fb8
使用以下过程,我能够看到作为字典键传递的字符串:
1-托管函数的转储堆栈
003ced0c 7123f326 (MethodDesc 7053d6c8 System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].get_Item(System.__Canon))
003ced18 00200136 (MethodDesc 001837d8 +0xe6 UserInArgument.Program.Main(System.String[]))
2-转储字典索引器的IL
ilAddr = 012d2050
IL_0000: nop
IL_0001: newobj UserInArgument.WorkflowInCode::.ctor
IL_0006: stloc.1
IL_0007: ldloc.1
IL_0008: ldstr "Dblk"
IL_000d: call class [System.Activities]System.Activities.InArgum甥휄Έ섛撮 횰Έ辋撩았ϯ::op_Implicit
IL_0012: callvirt UserInArgument.WorkflowInCode::set_FirstName
IL_0017: nop
IL_0018: ldloc.1
IL_0019: ldstr "third sample"
IL_001e: call class [System.Activities]System.Activities.InArgum甥휄Έ섛撮 횰Έ辋撩았ϯ::op_Implicit
IL_0023: callvirt UserInArgument.WorkflowInCode::set_SecondName
IL_0028: nop
IL_0029: ldloc.1
IL_002a: call System.Activities.WorkflowInvoker::Invoke
IL_002f: pop
IL_0030: newobj UserInArgument.Workflow::.ctor
IL_0035: call System.Activities.WorkflowInvoker::Invoke
IL_003a: stloc.0
IL_003b: ldloc.0
IL_003c: ldstr "OutMessage_Should_Fail"
IL_0041: callvirt class [mscorlib]System.Collections.Generic.IDictio甥휄Έ섛撮 횰Έ辋撩았ϯ::get_Item
IL_0046: call System.Console::WriteLine
IL_004b: nop
IL_004c: ret
ldstr函数将新对象引用推送到字符串literal->ldstr“OutMessage\u应\u失败”。使用以下过程,我能够看到作为字典键传递的字符串: 1-托管函数的转储堆栈
003ced0c 7123f326 (MethodDesc 7053d6c8 System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].get_Item(System.__Canon))
003ced18 00200136 (MethodDesc 001837d8 +0xe6 UserInArgument.Program.Main(System.String[]))
2-转储字典索引器的IL
ilAddr = 012d2050
IL_0000: nop
IL_0001: newobj UserInArgument.WorkflowInCode::.ctor
IL_0006: stloc.1
IL_0007: ldloc.1
IL_0008: ldstr "Dblk"
IL_000d: call class [System.Activities]System.Activities.InArgum甥휄Έ섛撮 횰Έ辋撩았ϯ::op_Implicit
IL_0012: callvirt UserInArgument.WorkflowInCode::set_FirstName
IL_0017: nop
IL_0018: ldloc.1
IL_0019: ldstr "third sample"
IL_001e: call class [System.Activities]System.Activities.InArgum甥휄Έ섛撮 횰Έ辋撩았ϯ::op_Implicit
IL_0023: callvirt UserInArgument.WorkflowInCode::set_SecondName
IL_0028: nop
IL_0029: ldloc.1
IL_002a: call System.Activities.WorkflowInvoker::Invoke
IL_002f: pop
IL_0030: newobj UserInArgument.Workflow::.ctor
IL_0035: call System.Activities.WorkflowInvoker::Invoke
IL_003a: stloc.0
IL_003b: ldloc.0
IL_003c: ldstr "OutMessage_Should_Fail"
IL_0041: callvirt class [mscorlib]System.Collections.Generic.IDictio甥휄Έ섛撮 횰Έ辋撩았ϯ::get_Item
IL_0046: call System.Console::WriteLine
IL_004b: nop
IL_004c: ret
ldstr函数将新对象引用推送到字符串literal->ldstr“OutMessage\u Should\u Fail”。此方法不适用于所有情况。例如,我无法确定传递给控制台的字符串文本。Readline()函数。我故意对其进行编码以引起InvalidCastException。所有奇怪的UTF字符是什么?在WinDbg中是否会出现这种情况?此方法并非在所有情况下都有效。例如,我无法确定传递给控制台的字符串文本。Readline()函数。我故意对其进行编码以引起InvalidCastException。所有奇怪的UTF字符是什么?在你的WinDbg里是这样的吗?