2015-08-30 107 views
1

我使用OutArgument創建了一個WF程序。當我嘗試訪問Dictionary上的鍵時,我得到一個KeyNotFoundException,並且該過程終止。我創建了一個失敗的進程轉儲,CLR線程堆棧如下。我可以在Main方法框架上看到四個當地人。確定正在通過方法訪問什麼變量

如何確定主框架上的哪個本地引用了正在訪問的字典?我必須檢查所有當地人嗎?還是可以從上面的框架中確定?

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

使用以下過程我能夠看到正被作爲關鍵詞典傳遞的字符串:

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函數將新對象引用推送到字符串文字 - > ldstr「OutMessage_Should_Fail」。

+0

此方法在任何情況下都不起作用。例如,我無法確定傳遞給控制檯的字符串文字。 Readline()函數。我故意編碼導致InvalidCastException。 – dcrearer

+0

什麼是所有奇怪的UTF字符?它在WinDbg中看起來像那樣嗎? –

+0

@thomas是的,他們是 – dcrearer

相關問題