2010-12-30 2 views
4

У меня есть служба WCF, работающая на сервере, а иногда (1-2 раза в месяц) она выдает COMException с информативным сообщением «Неизвестная ошибка (0x8005008)». Когда я googled для этой конкретной ошибки, у меня возникли проблемы с созданием виртуальных каталогов в IIS. И исходный код не имеет ничего общего с созданием виртуального каталога в IIS.Отладка Postmortem с помощью WinDBG

DirectoryServiceLib.LdapProvider.Directory - CreatePost - Could not create employee for 195001010000,000000000000: System.Runtime.InteropServices.COMException (0x80005008): Unknown error (0x80005008) at System.DirectoryServices.PropertyValueCollection.PopulateList 

Я принял memorydump, когда я поймаю Исключение для дальнейшего анализа в WinDBG. После переключения на правую нить я выполнил команду CLRStack:

000000001b8ab6d8 000000007708671a [NDirectMethodFrameStandalone: 000000001b8ab6d8] Common.MemoryDump.MiniDumpWriteDump(IntPtr, Int32, IntPtr, MINIDUMP_TYPE, IntPtr, IntPtr, IntPtr) 
000000001b8ab680 000007ff002808d8 DomainBoundILStubClass.IL_STUB_PInvoke(IntPtr, Int32, IntPtr, MINIDUMP_TYPE, IntPtr, 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, DirectoryServiceLib.Model.Post, DirectoryServiceLib.Model.Presumptions, Services.Common.SourceEnum, System.String) 
000000001b8adbe0 000007ff00279532 DirectoryServiceLib.WCFDirectory.CreatePost(System.String, DirectoryServiceLib.Model.Post, DirectoryServiceLib.Model.Presumptions, Services.Common.SourceEnum, System.String) 
000000001b8adc60 000007ff001f47bd DynamicClass.SyncInvokeCreatePost(System.Object, System.Object[], System.Object[]) 

Мой вывод заключается в том, что он терпит неудачу, когда код вызова System.DirectoryServices.PropertyCollection.get_Item (System.String). !

Таким образом, после выдачи CLRStack -a я получаю этот результат:

000000001b8ad8a0 000007feec22d023 System.DirectoryServices.PropertyCollection.get_Item(System.String) 
    PARAMETERS: 
     this = <no data> 
     propertyName = <no data> 
    LOCALS: 
     <CLR reg> = 0x0000000001dcef78 
     <no data> 

Мой самый первый вопрос не почему это отображение нет данных о PROPERTYNAME? Я новичок в Windbg. Однако я выполнил dumpobject на = 0x0000000001dcef78:

0:013> !do 0x0000000001dcef78 
Name:  System.String 
MethodTable: 000007fef66d6960 
EEClass:  000007fef625eec8 
Size:  74(0x4a) bytes 
File:  C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.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 << 

Так что, когда исходный код хочет принести personalprescriptioncode из Active Directory (что используется для сохранения состояния слоя) он выходит из строя. Оглядываясь назад на стек, он выдает метод копирования. DirectoryServiceLib.LdapProvider.DirectoryPost.Copy (DirectoryServiceLib.LdapProvider.DirectoryPost)

Так, глядя в исходный код:

DirectoryPost postInLimbo = DirectoryPostFactory.Instance().GetDirectoryPost(LdapConfigReader.Instance().GetConfigValue("LimboDN"), idGenPerson.ID.UserId); 
if (postInLimbo != null) 
    newPost.Copy(postInLimbo); 

Этот код ищет другую должность в OU = подвешенном с тем же UserId и если он находит один, он копирует атрибуты в новое сообщение. В этом случае это происходит, и он терпит неудачу с кодом personalprescription. Я просмотрел в Active Directory в OU = Limbo, и почта существует там с атрибутом personalprescriptioncode = 31243.

Вопрос 1: Почему он не отображает данные для некоторых ПАРАМЕТРОВ И ЛОКАЛЬНЫХ ЛИЦ? Это GC, который очистился до того, как был создан memorydump.

Вопрос 2: Я могу больше сделать, чтобы решить эту проблему?

+1

Вы должны изменить заголовок вопроса, он не имеет ничего общего с WCF, это ошибка каталога. – fejesjoco

+0

Вы правы, вопрос был разработан для чего-то другого. Это сделано сейчас – Drazar

ответ

1
// 
// MessageId: E_ADS_BAD_PARAMETER 
// 
// MessageText: 
// 
// One or more input parameters are invalid 
// 
#define E_ADS_BAD_PARAMETER    _HRESULT_TYPEDEF_(0x80005008L) 

Вы не можете видеть значения аргумента/локальной переменной, потому что код оптимизирован. Они сохраняются в регистре CPU во время вызова, а не в кадре стека. Вы больше не можете найти иглу в стоге сена.

+1

Так что это случай необъяснимых :). Ну, по крайней мере, я знаю, где я могу добавить дополнительную информацию для отладки до следующего раза. – Drazar

Смежные вопросы