c# – 使用WinDBG进行Postmortem调试
我有一个在服务器上运行的WCF服务,偶尔(每月1-2次)它会抛出一个带有信息性消息“Unknown error(0x8005008)”的COMException.当我搜索这个特定的错误时,我只在IIS中创建虚拟目录时遇到问题.并且源代码与在IIS中创建虚拟目录没有任何关系.
DirectoryServiceLib.LdapProvider.Directory - CreatePost - Could not create employee for 195001010000,000000000000: System.Runtime.InteropServices.COMException (0x80005008): Unknown error (0x80005008) at System.DirectoryServices.PropertyValueCollection.PopulateList 当我在WinDBG中捕获Exception以进一步分析时,我已经使用了memorydump.切换到正确的线程后,我执行了!CLRStack命令: 000000001b8ab6d8 000000007708671a [NDirectMethodFrameStandalone: 000000001b8ab6d8] Common.MemoryDump.MiniDumpWriteDump(IntPtr,Int32,IntPtr,MINIDUMP_TYPE,IntPtr) 000000001b8ab680 000007ff002808d8 DomainBoundILStubClass.IL_STUB_PInvoke(IntPtr,IntPtr) 000000001b8ab780 000007ff00280812 Common.MemoryDump.CreateMiniDump(System.String) 000000001b8ab7e0 000007ff0027b218 DirectoryServiceLib.LdapProvider.Directory.CreatePost(System.String,DirectoryServiceLib.Model.Post,DirectoryServiceLib.Model.Presumptions,Services.Common.SourceEnum,System.String) 000000001b8ad6d8 000007fef8816869 [HelperMethodFrame: 000000001b8ad6d8] 000000001b8ad820 000007feec2b6c6f System.DirectoryServices.PropertyValueCollection.PopulateList() 000000001b8ad860 000007feec225f0f System.DirectoryServices.PropertyValueCollection..ctor(System.DirectoryServices.DirectoryEntry,System.String) 000000001b8ad8a0 000007feec22d023 System.DirectoryServices.PropertyCollection.get_Item(System.String) 000000001b8ad8f0 000007ff00274d34 Common.DirectoryEntryExtension.GetStringAttribute(System.String) 000000001b8ad940 000007ff0027f507 DirectoryServiceLib.LdapProvider.DirectoryPost.Copy(DirectoryServiceLib.LdapProvider.DirectoryPost) 000000001b8ad980 000007ff0027a7cf DirectoryServiceLib.LdapProvider.Directory.CreatePost(System.String,System.String) 000000001b8adbe0 000007ff00279532 DirectoryServiceLib.WCFDirectory.CreatePost(System.String,System.String) 000000001b8adc60 000007ff001f47bd DynamicClass.SyncInvokeCreatePost(System.Object,System.Object[],System.Object[]) 我的结论是它在代码调用时失败了 所以在发出!CLRStack -a之后我得到了这个结果: 000000001b8ad8a0 000007feec22d023 System.DirectoryServices.PropertyCollection.get_Item(System.String) PARAMETERS: this = <no data> propertyName = <no data> LOCALS: <CLR reg> = 0x0000000001dcef78 <no data> 我的第一个问题是为什么它没有显示属性名称的数据?我在Windbg上有点新鲜.但是我在= 0x0000000001dcef78上执行了一个dumpobject: 0:013> !do 0x0000000001dcef78 Name: System.String MethodTable: 000007fef66d6960 EEClass: 000007fef625eec8 Size: 74(0x4a) bytes File: C:WindowsMicrosoft.NetassemblyGAC_64mscorlibv4.0_4.0.0.0__b77a5c561934e089mscorlib.dll String: personalprescriptioncode Fields: MT Field Offset Type VT Attr Value Name 000007fef66dc848 40000ed 8 System.Int32 1 instance 24 m_stringLength 000007fef66db388 40000ee c System.Char 1 instance 70 m_firstChar 000007fef66d6960 40000ef 10 System.String 0 shared static Empty >> Domain:Value 0000000000174e10:00000000019d1420 000000001a886f50:00000000019d1420 << 因此,当源代码想要从Active Directory(用于持久层的内容)中获取个人订阅代码时,它就会失败.回顾堆栈时发出Copy方法. 所以查看源代码: DirectoryPost postInLimbo = DirectoryPostFactory.Instance().GetDirectoryPost(LdapConfigReader.Instance().GetConfigValue("LimboDN"),idGenPerson.ID.UserId); if (postInLimbo != null) newPost.Copy(postInLimbo); 此代码在OU = limbo中查找具有相同UserId的另一个帖子,如果找到一个,则将属性复制到新帖子.在这种情况下确实如此,并且它与个人订阅代码失败.我在OU = Limbo下查看了Active Directory,帖子中存在属性personalprescriptioncode = 31243. 问题1:为什么它没有显示某些PARAMETERS和LOCALS的数据?是否在创建memorydump之前清理了GC. 问题2:我能做些什么才能解决这个问题? 解决方法// // MessageId: E_ADS_BAD_PARAMETER // // MessageText: // // One or more input parameters are invalid // #define E_ADS_BAD_PARAMETER _HRESULT_TYPEDEF_(0x80005008L) 您无法查看参数/局部变量值,因为代码已经过优化.它们在调用时存储在CPU寄存器中,而不是堆栈帧.你再也找不到大海捞针了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |