使用进程内存转储轻松解决事件查看器错误
今天我将写一篇关于我如何使用SOS.Net框架调试扩展(和!analyze-v)以轻松解决.NETFramework异常。此异常阻止事件查看器正确显示。事件查看器返回了一个错误,该错误提供了有关导致该问题的实际原因的很少信息。在本例中,我将演示如何使用windbg来获取有关出错的信息。我不必对此问题执行实时调试。相反,我使用进程转储来获取与根本原因相关的非常精确的信息,这些信息由调试器返回。然后我可以使用进程监视器来识别需要检查的文件。这些行动使我找到了问题的根源,很容易就得到了纠正。
报告的问题:打开时遇到以下错误事件vwr.msc(事件查看器)在Windows 2008 Server系统上:
"MMC could not create the snap-in."MMC could not create the snap-in.
The snap-inmight not have been installed correctly
Name: Event Viewer
CLSID: FX:{b05566ad-fe9c-4363-be05-7a4cbb7cb510}
Dump文件数据存储格式(四)
六、异常信息流(ExceptionStream
)
异常信息流包含异常信息。包括发生异常的线程、异常记录信息、线程上下文等信息。它紧挨着杂项信息流(MiscInfoStream
)后面。
MiscInfoStream
信息如下:
0x124+0n1365=0x678
我们看看ExceptionStream
信息
可知ExceptionStream的RVA为678h=0x124+0n1365。所以,
MiscInfoStream
后面就是ExceptionStream
。大小168字节,ExceptionStream
数据如下:
ExceptionStream
的数据结构如下:
typedef structMINIDUMP_EXCEPTION_STREAM {
ULONG32 ThreadId;
ULONG32 __alignment;
MINIDUMP_EXCEPTION ExceptionRecord;
MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
} MINIDUMP_EXCEPTION_STREAM,*PMINIDUMP_EXCEPTION_STREAM;
Dump文件数据存储格式(五)
七、线程列表流(ThreadListStream)
ThreadListStream流包含线程核心信息。它紧挨着异常信息流(ExceptionStream)。
异常信息流如下
0x678+0n168=0x720。而线程列表流如下
可知偏移是0x720,即证明杂项信息流是紧挨着系统信息流,大小有3796字节。
ThreadListStream包含的数据结构如下:
typedef struct_MINIDUMP_THREAD_LIST {
ULONG32 NumberOfThreads;
MINIDUMP_THREAD Threads[0];
} MINIDUMP_THREAD_LIST,*PMINIDUMP_THREAD_LIST;
关于异常System.IO.DirectoryNotFoundException
什么是System.IO.DirectoryNotFoundException
找不到文件或目录的部件时引发的异常。
继承关系
Dump文件数据存储格式(六)
八、线程信息列表流(
ThreadInfoListStream
)ThreadInfoListStream
包含了线程状态信息,在ThreadListStream
的后面就是ThreadInfoListStream
了。ThreadListStream
如下:0x720+0n3796=0x15F4
而
ThreadInfoListStream
如下:所以
ThreadInfoListStream
紧挨着ThreadListStream
,大小为5068字节。数据如下:ThreadInfoListStream
的数据由两个结构组成,一个是MINIDUMP_THREAD_INFO_LIST,另一个是MINIDUMP_THREAD_INFO。MINIDUMP_THREAD_INFO_LIST包含数据大小的信息,相当于头部结构,如下:
typedef struct_MINIDUMP_THREAD_INFO_LIST {
ULONG SizeOfHeader;
ULONG SizeOfEntry;
ULONG NumberOfEntries;
} MINIDUMP_THREAD_INFO_LIST,*PMINIDUMP_THREAD_INFO_LIST;