Frage

Ich habe einen WCF-Service, der auf einem Server ausgeführt wird, und gelegentlich (1-2 mal im Monat) wirft er eine COM-Annahme mit der informativen Nachricht "Unbekannter Fehler (0x8005008)". Als ich nach diesem speziellen Fehler gegoogelt habe, habe ich nur Threads zu Problemen, wenn ich virtuelle Verzeichnisse in IIS erstellt habe. Und der Quellcode hat nichts damit zu tun, ein virtuelles Verzeichnis in IIS zu erstellen.

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

Ich habe einen MemoryDump gemacht, als ich die Ausnahme für weitere Analysen in Windbg aufnehme. Nachdem ich zum rechten Thread umgestellt war, hat ich den Befehl! Clrstack ausgeführt:

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[])

Meine Schlussfolgerung ist, dass es fehlschlägt, wenn der Code anruftSystem.DirectoryServices.propertyCollection.get_item (System.String).

Also nach der Ausgabe eines! Clrstack -a bekomme ich dieses Ergebnis:

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

Meine allererste Frage ist, warum es keine Daten auf dem PropertyName zeigt. Ich bin ein bisschen neu bei Windbg. Ich habe jedoch ein DumptObject unter = 0x0000000001DCEF78 ausgeführt:

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 <<

Wenn der Quellcode den PersonalPrescriptionCode aus Active Directory (was für die Persistenzschicht verwendet wird) abrufen möchte, schlägt er fehl. Rückblickend auf den Stapel ist es bei der Ausgabe der Kopiermethode.DirectoryServicelib.ldapprovider.DirectoryPost.copy (DirectoryServicelib.Ldapprovider.DirectoryPost)

Also im Sourcecode schauen:

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

Dieser Code sucht nach einem weiteren Beitrag in Ou = Limbo mit derselben BenutzerID und findet eine, die die Attribute in den neuen Beitrag kopiert. In diesem Fall scheitert es und es fällt mit PersonalPrescriptionCode fehl. Ich habe in Active Directory unter OU = Limbo gesucht und der Beitrag existiert dort mit dem Attribut PersonalPrescriptionCode = 31243.

Frage 1: Warum zeigt es keine Daten für einige der Parameter und Einheimischen an? Ist es der GC, der vor dem Erstellen des MemoryDumps aufgeräumt hat?

Frage 2: Gibt ich noch, dass ich die Lösung für dieses Problem erreichen kann?

War es hilfreich?

Lösung

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

Sie können das Argument/die lokalen Variablenwerte nicht sehen, da der Code optimiert ist. Sie werden zum Zeitpunkt des Anrufs in CPU -Registern gespeichert, nicht im Stapelrahmen. Sie können die Nadel nicht mehr im Heuhaufen finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top