2010-04-30 16 views
7

मेरा सहकर्मी और मैं एक डब्ल्यूसीएफ सेवा में एक समस्या को डीबग कर रहा हूं जिस पर वह काम कर रहा है जहां स्ट्रिंग की लंबाई का सही मूल्यांकन नहीं किया जा रहा है। उन्होंने कहा कि इकाई परीक्षण अपने WCF सेवा में एक विधि के लिए इस विधि चल रहा है:स्ट्रिंग की लंबाई गलत तरीके से मूल्यांकन करना

// Unit test method 
public void RemoveAppGroupTest() 
{ 
    string addGroup = "TestGroup"; 
    string status = string.Empty; 
    string message = string.Empty; 

    appActiveDirectoryServicesClient.RemoveAppGroup("AOD", addGroup, ref status, ref message); 
} 


// Inside the WCF service 
[OperationBehavior(Impersonation = ImpersonationOption.Required)] 
public void RemoveAppGroup(string AppName, string GroupName, ref string Status, ref string Message) 
{ 
    string accessOnDemandDomain = "MyDomain"; 

    RemoveAppGroupFromDomain(AppName, accessOnDemandDomain, GroupName, ref Status, ref Message); 
} 

public AppActiveDirectoryDomain(string AppName, string DomainName) 
{ 
    if (string.IsNullOrEmpty(AppName)) 
    { 
     throw new ArgumentNullException("AppName", "You must specify an application name"); 
    } 
} 

हम नेट स्रोत कोड में कदम करने के लिए क्या मूल्य string.IsNullOrEmpty प्राप्त था देखने के लिए कोशिश की, लेकिन आईडीई इस संदेश को मुद्रित जब हम करने का प्रयास किया चर का मूल्यांकन करें: 'स्थानीय या तर्क' मान 'का मान प्राप्त नहीं कर सकता क्योंकि यह इस निर्देश सूचक पर उपलब्ध नहीं है, संभवतः क्योंकि इसे अनुकूलित किया गया है।' (शामिल परियोजनाओं में से कोई भी अनुकूलन सक्षम नहीं है)। इसलिए, हमने लंबाई जांच से ठीक पहले विधि के अंदर चर के मूल्य को स्पष्ट रूप से सेट करने का प्रयास करने का निर्णय लिया - लेकिन इससे मदद नहीं मिली।

// Lets try this again. 
public AppActiveDirectoryDomain(string AppName, string DomainName) 
{ 
    // Explicitly set the value for testing purposes. 
    AppName = "AOD"; 

    if (AppName == null) 
    { 
     throw new ArgumentNullException("AppName", "You must specify an application name"); 
    } 

    if (AppName.Length == 0) 
    { 
     // This exception gets thrown, even though it obviously isn't a zero length string. 
     throw new ArgumentNullException("AppName", "You must specify an application name"); 
    } 
} 

हम वास्तव में इस पर अपने बालों को खींच रहे हैं। क्या किसी और ने ऐसा व्यवहार किया है? इसे डीबग करने पर कोई सुझाव?

.method public hidebysig specialname rtspecialname instance void .ctor(string AppName, string DomainName) cil managed 
{ 
.maxstack 5 
.locals init (
    [0] class [System]System.Net.NetworkCredential ldapCredentials, 
    [1] string[] creds, 
    [2] string userName, 
    [3] class [mscorlib]System.ArgumentNullException exc, 
    [4] class [System.DirectoryServices]System.DirectoryServices.ActiveDirectory.DirectoryContext directoryContext, 
    [5] class [System.DirectoryServices]System.DirectoryServices.ActiveDirectory.Domain domain, 
    [6] class [System.DirectoryServices.Protocols]System.DirectoryServices.Protocols.LdapException V_6, 
    [7] class [mscorlib]System.Exception V_7, 
    [8] bool CS$4$0000, 
    [9] char[] CS$0$0001, 
    [10] string[] CS$0$0002) 
L_0000: ldarg.0 
L_0001: ldsfld string [mscorlib]System.String::Empty 
L_0006: stfld string MyNamespace.MyClass.AppActiveDirectoryDomain::appOU 
L_000b: ldarg.0 
L_000c: call instance void [mscorlib]System.Object::.ctor() 
L_0011: nop 
L_0012: nop 
L_0013: ldstr "AOD" 
L_0018: call bool [mscorlib]System.String::IsNullOrEmpty(string) 
L_001d: ldc.i4.0 
L_001e: ceq 
L_0020: stloc.s CS$4$0000 
L_0022: ldloc.s CS$4$0000 
L_0024: brtrue.s L_0037 
L_0026: nop 
L_0027: ldstr "AppName" 
L_002c: ldstr "You must specify an application name" 
L_0031: newobj instance void [mscorlib]System.ArgumentNullException::.ctor(string, string) 
L_0036: throw 

और MSIL string.IsNullOrEmpty कॉल के लिए:

.method public hidebysig static bool IsNullOrEmpty(string 'value') cil managed 
{ 
    .maxstack 8 
    L_0000: ldarg.0 
    L_0001: brfalse.s L_000d 
    L_0003: ldarg.0 
    L_0004: callvirt instance int32 System.String::get_Length() 
    L_0009: ldc.i4.0 
    L_000a: ceq 
    L_000c: ret 
    L_000d: ldc.i4.1 
    L_000e: ret 
} 

संपादित करें:


यहाँ AppActiveDirectoryDomain वस्तु है, जहां व्यवहार घटित है के लिए MSIL है

इसके अलावा, जब स्ट्रिंग की लंबाई की जाँच के बाद स्पष्ट रूप से घोषणा कर एक दूसरे अपवाद दिखा स्क्रीनशॉट फेंके:

यहाँ इस समय 'घड़ी' विंडो में चर का एक स्क्रीनशॉट ArgumentNullException फेंक दिया जाता है है यह ऊपर 5 लाइनें: http://imgur.com/lSrk9.png

अद्यतन # 3: हमने स्थानीय चर के नाम को बदलने की कोशिश की और यह शून्य जांच और लंबाई की जांच पास करता है, लेकिन जब हम string.IsNullOrEmpty पर कॉल करते हैं तो विफल हो जाता है। यह स्क्रीनशॉट देखें: http://imgur.com/Z57AA.png


जवाब:

  • हम किसी भी उपकरण है कि MSIL संशोधित करेगा प्रयोग नहीं करते। हमने एक क्लीनअप किया है, और बिल्ड निर्देशिकाओं से सभी फ़ाइलों को मैन्युअल रूप से हटा दिया है, और पुनर्निर्माण के लिए मजबूर किया है ... एक ही परिणाम।

  • निम्नलिखित कथन सत्य के रूप में मूल्यांकन करता है और यदि ब्लॉक: if (string.IsNullOrEmpty("AOD")) { /* */ } में प्रवेश करता है।

  • निर्माता तो जैसे कहा जाता है:

    try { using (AppActiveDirectoryDomain domain = new AppActiveDirectoryDomain(AppName, DomainName)) { } }

यह WCF सेवा विधि के भीतर ही तुरंत है, ऐपनाम और डोमेन नाम कॉल के पैरामीटर हैं। इन पैरामीटर को छोड़कर और नए तारों का उपयोग करके, हमें अभी भी त्रुटियां मिलती हैं।


+1

यदि आप फेंकने वाले अपवाद पर ब्रेकपॉइंट डालते हैं, और 'ऐपनाम' और 'AppName.Length' को घड़ियों में जोड़ते हैं, तो वे क्या दिखाते हैं? –

+0

वे 'AppName == "AOD" और' AppName.Length == 3 'दिखाते हैं - इसलिए वे सही ढंग से मूल्यांकन करते हैं। मैंने अपने प्रश्न के नीचे एक स्क्रीनशॉट संलग्न किया है। –

+1

आप परीक्षण को भी कम अस्पष्ट बना सकते हैं: 'अगर ("एओडी"। तरंग == 0) फेंक ... '। यह आपके मुद्दों के स्रोत के रूप में परिवर्तनीय 'AppName' को रद्द कर देगा। यदि अपवाद तब भी फेंक दिया जाता है, तो आप इसके बारे में कुछ भी नहीं कर सकते हैं। – stakx

उत्तर

0

यह 64-बिट मुद्दा बन गया। या कम से कम यह केवल 64-बिट चलने वाला एक मुद्दा है। 64-बिट ओएस पर आईआईएस 7.0 में, सभी वेबसाइटों को डिफ़ॉल्ट रूप से 64-बिट प्रक्रियाओं में होस्ट किया जाता है। अगर हम 32-बिट प्रक्रिया में होस्ट करने के लिए सेवा सेट करते हैं, तो समस्या दूर हो जाती है।

1

दुर्भाग्यवश, आपके कोड उदाहरण यह नहीं दिखाते कि कहां और कैसे असफल निर्माता को बुलाया जाता है, यानी। जहां AppActiveDirectoryDomain प्रकार का ऑब्जेक्ट तत्काल है। (आपके द्वारा प्रदान किए गए अंतिम कोड उदाहरण को देखते हुए, इससे कोई फर्क नहीं पड़ता।)

कहा जा रहा है कि, मैं कोड स्टूडियो के साथ खेलते समय एक बार विजुअल स्टूडियो में समान अनौपचारिक मुद्दों पर आया हूं (जो फिर से लिखता है संकलक से उत्सर्जित सीआईएल निर्देश) और एक यादृच्छिक कारण के लिए एक और समय। मुझे कभी भी सही समस्या नहीं मिली, मुझे याद है कि कुछ कोड पूरी तरह से अलग जगह में बदल रहे हैं और अचानक, समस्या हल हो गई थी।

मुझे संदेह है कि कभी-कभी, डीबगर किसी भी तरह वास्तविक प्रोग्राम के राज्य के साथ सिंक हो जाता है।

कुछ सवाल:

  • आप किसी भी उपकरण है कि फिर से लिखें सीआईएल (= MSIL) कोड के बाद संकलक समाप्त हो गया है उपयोग करते हैं? (जैसे कोड संविदाएं या पोस्टशर्प)

  • क्या यह हो सकता है कि आपकी डीबगर प्रतीक फ़ाइलें या प्रोग्राम डेटाबेस संकलित कोड के साथ सिंक हो? क्या आपने एक परियोजना साफ-सफाई की है?

    • बयान if ("AOD".Length == 0) throw new ArgumentNullException(...); केवल उस विशेष निर्माता के अंदर फेंक है:

    आप अगले कोशिश कर सकते? या क्या यह मुद्दा जारी रहता है यदि आप कॉलर फ़ंक्शन पर उस कथन को स्थानांतरित करते हैं? यदि आप इसे स्थानांतरित करते हैं तो यह अभी भी जारी रहता है Main() विधि पर?

  • (StackOverflow पर एक और सवाल के बारे में MSIL डिबगरलिंक) यदि आप एक उपलब्ध एक different debugger के साथ अपने कोड का प्रयास करें।

+0

मैंने अपने प्रश्न में प्रतिक्रियाएं जोड़ दीं। –

2

2 सुझाव

  1. उपयोग ILDASM, आईएल जाता है कि उनके जेनरेट होने पर एक नज़र डालें संभवतः यहां आईएल पोस्ट करने के लिए इतना समुदाय एक नज़र

  2. बदलें लग सकते हैं उदाहरण के लिए 'AppName' तर्क का नाम बहुत अलग 'xxxAppName' है।

मैं जानता हूँ कि बिंदु 2 व्यर्थ लग सकता है लेकिन मैं पहले की तरह प्रतीत होता है unexplainable स्थितियों के पार चलो, केवल खोजने के लिए कि कुछ संकलित नहीं किया जा रहा था या एक गुंजाइश संघर्ष था, जबकि डिबगर से पता चलता है कि तुम क्या उम्मीद । और, यह कोशिश करने के लिए चोट नहीं पहुंचाएगा :)

+0

हमने स्थानीय चर के लिए एक अलग नाम का उपयोग करने का प्रयास किया, और यह मैन्युअल नल चेक के साथ-साथ लम्बाई चेक भी सफल करता है, लेकिन फिर 'string.IsNullOrEmpty' में विफल रहता है। मैं पोस्ट कर रहा हूँ तीसरा स्क्रीनशॉट लिंक देखें। –

+0

मैंने आईएल पोस्ट किया। यह हम में से किसी के लिए फिश नहीं दिखता है, लेकिन हम में से कोई भी आईएल विशेषज्ञ नहीं हैं। –

+0

@ जस्टिन, आईएल ठीक दिखता है ... क्या आप डीबग विंडो (डायग्नोस्टिक्स.डेबग। राइटलाइन) में कुछ संदेश लिख सकते हैं। हम देखते हैं कि डीबगर क्या देख रहा है, लेकिन यह देखने में मदद कर सकता है कि निष्पादन कोड क्या देख रहा है। –

संबंधित मुद्दे