我正在使用带有.dmp文件的debugdiag 1.2。我一直在使用Microsoft支持,我们获得了不同的函数跟踪细节 - 他的版本更详细,包含函数名称和参数。
我想知道是否有一些我不想和他一样的东西?
例如,我会得到:
ntdll!NtWaitForMultipleObjects+a
KERNELBASE!WaitForMultipleObjectsEx+e5
clr!WaitForMultipleObjectsEx_SO_TOLERANT+62
clr!Thread::DoAppropriateAptStateWait+53
clr!Thread::DoAppropriateWaitWorker+186
clr!Thread::DoAppropriateWait+7d
clr!WaitHandleNative::CorWaitOneNative+151
mscorlib_ni+509aa4
0x000007fd`231e0e5c
mscorlib_ni+4efd85
mscorlib_ni+4efae9
mscorlib_ni+4efaa7
mscorlib_ni+d529ad
对于相同的转储文件,他将获得:
ntdll!ZwWaitForMultipleObjects+a
KERNELBASE!WaitForMultipleObjectsEx+e5
clr!WaitForMultipleObjectsEx_SO_TOLERANT+62
clr!Thread::DoAppropriateAptStateWait+53
clr!Thread::DoAppropriateWaitWorker+186
clr!Thread::DoAppropriateWait+7d
clr!WaitHandleNative::CorWaitOneNative+151
mscorlib_ni!System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle, Int64, Boolean, Boolean)+14
FiftyOne_Foundation!Unknown+3c
mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+285
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+9
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)+57
mscorlib_ni!System.Threading.ThreadHelper.ThreadStart(System.Object)+5d
DebugDiag看起来像一个非常有用的工具 - 我非常希望能够很好地理解它。提前感谢您的时间。
答案 0 :(得分:1)
不同之处在于Microsoft支持使用内部 PRIVATE SYMBOLS ,当您将调试诊断工具与PRIVATE符号一起使用时,报告中显示的NATIVE堆栈更准确,更好,因为调试器(dbgeng。 dll和dbghelp.dll是特定的)能够找出托管函数名称,并且它们在本机堆栈中显示它们就好像它们是本机函数但是如果我们使用PUBLIC符号(来自msdl.microsoft.com)来分析在转储中,这些函数名称不会显示在本机堆栈部分下的调试诊断报告中。
您仍然可以在报告中的线程的MANAGED callstack下看到正确的函数名称
我还可以看到转储中加载的CLR是4.0或更高,因此如果您使用Debug Diagnostic 2.0,那么您将获得更好的堆栈,因为它是专门针对目标4.0及更高版本的框架运行时编写的。您可以从http://www.microsoft.com/en-us/download/details.aspx?id=40336
下载