Вопрос

У меня есть WCF-сервис, работающий на сервере, и иногда (1-2 раза в месяц) он бросает Comexception с информативным сообщением «Неизвестная ошибка (0x8005008)». Когда я погуглил эту конкретную ошибку, я получил только потоки о проблемах при создании виртуальных каталогов в 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. После перехода на правильный потока я выполнил команду! 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>

Мой самый первый вопрос заключается в том, почему он не отображает никаких данных на имя свойства? Я немного новый на Windbg. Однако я выполнил dillobject на = 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)

Так глядя в SourceCode:

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

Этот код ищет еще один пост в OU = LIMBO с тем же пользователем, и если он находит один, он копирует атрибуты в новый пост. В этом случае это происходит, и это терпит неудачу с личным предпринимательским кодом. Я посмотрел в Active Directory под OU = LIMBO, и POST существует там с атрибутом PersonalPrescriptionCode = 31243.

Вопрос 1: Почему он не отображает данные для некоторых параметров и местных жителей? Это GC, который очистился до создания памяти.

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top