C# 如何从windbg堆栈跟踪中了解参数

C# 如何从windbg堆栈跟踪中了解参数,c#,windbg,C#,Windbg,例如,堆栈如下所示: RetAddr : Args to Child : Call Site 000007fe`fda210dc : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!ZwWaitForSingleObject+0xa 000007fe`

例如,堆栈如下所示:

RetAddr           : Args to Child                                                           : Call Site
000007fe`fda210dc : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!ZwWaitForSingleObject+0xa
000007fe`ec3d1c87 : 00000000`00000000 00000000`00000340 00000000`00000000 00000000`00000340 : KERNELBASE!WaitForSingleObjectEx+0x79
000007fe`ec3d1c30 : 00000000`00000000 00000000`02530de0 00000000`01025e50 00000000`0302c280 : clr!Thread::LeaveRuntimeNoThrow+0x7c
000007fe`ec3d1ae3 : 00000000`c00000bb 00000000`00000000 00000000`00000058 000007fe`fda2393d : clr!Thread::LeaveRuntimeNoThrow+0xe4
000007fe`ec44088e : 00000000`056a9cf8 00000000`00000000 00000000`00000000 000007fe`ec435fbb : clr!CLREvent::WaitEx+0x5e
000007fe`ec44079a : 00000000`00000004 000007fe`eff75b35 00000000`c00000bb 00000000`00000000 : clr!SVR::GCHeap::WaitUntilGCComplete+0x2b
000007fe`ec52f455 : 00000000`02530de0 00000000`00000001 00000000`023f8130 00000001`5f758e68 : clr!Thread::RareDisablePreemptiveGC+0x1e2
000007fe`ec3ccffc : 000007ff`008098fa 00000000`0302c5b0 00000000`00000001 00000000`00000000 : clr!AllocateArrayEx+0x5e5
000007fe`eff6d4dd : 000007ff`008098fa 00000000`00000004 00000006`808aff60 00000000`00000004 : clr!JIT_NewArr1+0x45c
000007fe`eff662ea : 00000002`726d4510 00000001`125888f8 00000000`d0947070 00000000`0001f539 : mscorlib_ni!System.Collections.Generic.List`1[[System.__Canon, mscorlib]].set_Capacity(Int32)+0x5d
000007ff`00b57d45 : 00000001`1f720488 08d106e6`26d9c000 00000001`5f749a00 00000000`0302c838 : mscorlib_ni!System.Collections.Generic.List`1[[System.__Canon, mscorlib]].Add(System.__Canon)+0x4a
如何知道设置_容量的参数(即大小)?谢谢

000007fe`eff662ea : 00000002`726d4510 00000001`125888f8 00000000`d0947070 00000000`0001f539 : mscorlib_ni!System.Collections.Generic.List`1[[System.__Canon, mscorlib]].set_Capacity(Int32)+0x5d

我只备份windbg控制台日志,但不幸丢失了转储文件。

它看起来像托管代码。更具体地说,.Net 4或更大。首先,使用命令lmv m clr检查clr的版本。然后使用.load c:[路径]\sos.dll加载相应版本的sos。如果您确定该版本,也可以尝试.loadby sos clr。那就做一个梦吧!clrstack-p。请注意,如果这是一个发布版本,则方法可能已经过优化或内联,因此检索参数信息不太容易。问题发生在几天前,不幸的是转储文件丢失。我们仅在机器重新启动前保存了windbg控制台日志。假设调用堆栈正确且未损坏,您必须查找
set\u capacity
的函数签名并尝试匹配它们,如果幸运的话,这些参数不是句柄/引用/指针,并且是有效的整数值,看看你的参数,虽然这看起来不太可能,因为除了
1f539
之外,所有的值都很大,它是
128313
,所以我认为如果你在x64上没有转储文件,那么你就不走运了。前四个参数被传递到寄存器rcx,rdx,r8,我找到了一种方法:创建一个属性集方法,比如set{u aInt=value;Thread.Sleep(10000000);},然后在正常运行时获取调用跟踪信息,查看哪个寄存器存储参数。例如,当我调用property=12并调用trace告诉第二个寄存器存储12时,我可以得出第二个寄存器用于存储set(int)方法的参数的结论吗?