2013-02-13 11 views
18

कहा जाता है मैं एक मौजूदा परियोजना जहाँ मैं सभी कॉल पता लगाने के लिए चाहते हैं बनाया जा रहा है और हो सकता है एक लॉग फ़ाइल में डंप।हर विधि का पता लगाने के लिए कैसे

मैं एक नज़र at this thread था, लेकिन ज्यादा मदद नहीं था। मैंने पोस्टशर्प की कोशिश की, और उदाहरण दिखाता है कि इसे कैसे प्राप्त किया जाए। लेकिन मुझे हर धुन विधि में एक विशेषता जोड़ने की जरूरत है। एक मौजूदा परियोजना होने के नाते, कई तरीकों से जो एक व्यवहार्य विकल्प नहीं है।

क्या कोई अन्य साधन है जिसके द्वारा मैं जल्दी से जाने वाली सभी कॉल ट्रेस कर सकते हैं है?

+0

आप http://stackoverflow.com/questions/171970/how-can-i-find-the-method-that-called-the-current-method –

+0

मैं मदद नहीं कर सकता पर एक दृष्टि डाली है लेकिन आश्चर्य है कि आप ऐसा क्यों चाहते हैं। अपवाद के मामले में आप स्टैकट्रैक देख सकते हैं। लेकिन आप सभी विधि कॉल का लॉग क्यों चाहते हैं? – comecme

+0

एक बग है जिसे हम एक निश्चित बिंदु तक ट्रेस करने में सक्षम हैं, और उसके बाद नियंत्रण पैरेंट ऐप पर जाता है जो हमारा आवेदन नहीं है - इसलिए कोई स्रोत कोड नहीं है (इसके बाद कहीं भी ऐप प्रत्युत्तर देना बंद कर देता है)। इसके बाद हमारे ऐप में क्या कहा जाता है यह जानने के लिए हम इसे आजमा रहे हैं। –

उत्तर

9

आप Unity Interception

के साथ ऐसा कर इस article for a sample देख सकते हैं। आलेख विशेषता का उपयोग करता है, लेकिन मेरा कोड नमूना नीचे अवरोध स्थापित करने के लिए निर्भरता इंजेक्शन सिस्टम (इंटरफ़ेस को कोडिंग) का उपयोग करता है।

आप MyClass लॉग इन करना चाहते हैं, तो यह कुछ इस तरह चला जाता है:

  1. एक अंतरफलक है कि MyClass में सभी तरीकों में शामिल है सुनिश्चित =>IMyClass
  2. आप सेटअप InterfaceInterception (जैसे मैं नीचे किया है) या कुछ अन्य तरीके हैं जिन्हें आप इसे सेट अप कर सकते हैं। here for all options देखें।
  3. आप करेंगे सेटअप एक नीति सभी तरीकों कि IMatchingRule से मेल खाता है रोकना।
  4. सभी कॉल अब अपनी ICallHandler कार्यान्वयन द्वारा रोक दिया जाएगा।

कोड:

//You will use the code like this: 
MyContainer container = new MyContainer(); 
//setup interception for this type.. 
container.SetupForInteception(typeof(IMyClass)); 
//what happens here is you get a proxy class 
//that intercepts every method call. 
IMyClass cls = container.Resolve<IMyClass>(); 

//You need the following for it to work: 
public class MyContainer: UnityContainer 
{ 
    public MyContainer() 
    { 
     this.AddNewExtension<Interception>(); 
     this.RegisterType(typeof(ICallHandler), 
        typeof(LogCallHandler), "MyCallHandler"); 
     this.RegisterType(typeof(IMatchingRule), 
         typeof(AnyMatchingRule), "AnyMatchingRule"); 

     this.RegisterType<IMyClass, MyClass>(); 
    } 
    //apparently there is a new way to do this part 
    // http://msdn.microsoft.com/en-us/library/ff660911%28PandP.20%29.aspx 

    public void SetupForInteception(Type t) 
    { 
     this.Configure<Interception>() 
     .SetInterceptorFor(t, new InterfaceInterceptor()) 
     .AddPolicy("LoggingPolicy") 
     .AddMatchingRule("AnyMatchingRule") 
     .AddCallHandler("MyCallHandler"); 

    } 
} 
//THIS will match which methods to log. 
public class AnyMatchingRule : IMatchingRule 
{ 
    public bool Matches(MethodBase member) 
    { 
     return true;//this ends up loggin ALL methods. 
    } 
} 
public class LogCallHandler : ICallHandler 
{ 
    public IMethodReturn 
      Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
    { 
     //All method calls will result in a call here FIRST. 
     //IMethodInvocation has an exception property which will let you know 
     //if an exception occurred during the method call. 
    } 
} 
+0

मुझे लगता है कि वह प्रत्येक को एक विशेषता जोड़ने के बिना ऐसा करने का प्रयास कर रहा है विधि/वर्ग (जो नमूना से अलग है) – eyossi

+0

लेकिन मेरे कोड को किसी भी विशेषता की आवश्यकता नहीं है। – gideon

+0

लगता है जैसे आपको प्रत्येक वर्ग के लिए एक इंटरफ़ेस बनाना आवश्यक है; मेरी राय में, गुणों की तुलना में यह और भी काम है। –

4

मोड अनुरेखण में एक प्रोफाइलर का प्रयोग करें। फिर आप देखेंगे कि सब कुछ एक-दूसरे को कैसे कॉल करता है और जहां समय बिताया जाता है। वाणिज्यिक प्रोफाइलरों के अलावा मुफ्त भी हैं। प्रबंधित कोड के लिए वहाँ NP Profiler जो काफी अच्छा है।

यदि आप गहरे जाना चाहते हैं तो आप Windows Performance Toolkit का उपयोग कर सकते हैं जो आपको सभी धागे में पूर्ण जानकारी देता है और यदि आप जानना चाहते हैं तो एक दूसरे के साथ कैसे बातचीत करते हैं। केवल अंतर यह है कि आप अपने प्रबंधित फ्रेम तक कर्नेल से लेकर ढेर प्राप्त करते हैं।

यदि यह पर्याप्त आप साधन एक अनुरेखण पुस्तकालय (या तो स्वत: PostSharp साथ, ....) या मैन्युअल रूप से या प्रत्येक स्रोत फ़ाइल के लिए एक मैक्रो के साथ अपने कोड कर सकते हैं नहीं है। मैं जो काफी तेजी से और अत्यधिक विन्यास योग्य है एक छोटे से ट्रेसिंग पुस्तकालय बना दिया है। here देखें। अद्वितीय सुविधा के रूप में यह स्वचालित रूप से किसी भी फेंकने वाले अपवाद का पता लगा सकता है।

private void SomeOtherMethod() 
{ 
    using (Tracer t = new Tracer(myType, "SomeOtherMethod")) 
    { 
     FaultyMethod(); 
    } 
} 

private void FaultyMethod() 
{ 
    throw new NotImplementedException("Hi this a fault"); 
} 

यहाँ उत्पादन आता है:

18:57:46.665 03064/05180 <{{   > ApiChange.IntegrationTests.Diagnostics.TracingTests.SomeMethod 
    18:57:46.668 03064/05180 <{{   > ApiChange.IntegrationTests.Diagnostics.TracingTests.SomeOtherMethod 
    18:57:46.670 03064/05180 <   }}< ApiChange.IntegrationTests.Diagnostics.TracingTests.SomeOtherMethod Exception thrown: System.NotImplementedException: Hi this a fault  
at ApiChange.IntegrationTests.Diagnostics.TracingTests.FaultyMethod() 
at ApiChange.IntegrationTests.Diagnostics.TracingTests.SomeOtherMethod() 
at ApiChange.IntegrationTests.Diagnostics.TracingTests.SomeMethod()  
at ApiChange.IntegrationTests.Diagnostics.TracingTests.Demo_Show_Leaving_Trace_With_Exception() 

18:57:46.670 03064/05180 <   }}< ApiChange.IntegrationTests.Diagnostics.TracingTests.SomeOtherMethod Duration 2ms 18:57:46.689 03064/05180 <   }}< ApiChange.IntegrationTests.Diagnostics.TracingTests.SomeMethod Duration 24ms 
5

PostSharp निश्चित रूप से उन्हें स्पष्ट रूप से विशेषताओं के साथ सजाने के बिना कई लक्ष्यों के एक पहलू को लागू करने के लिए एक रास्ता प्रदान करता है। Multicast attributes देखें।

जब विकासशील (बहुस्त्र्पीय) पहलू आप इसके उपयोग उल्लेख करना होगा:

[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Instance)] 
[AttributeUsage(AttributeTargets.Assembly|AttributeTargets.Class|AttributeTargets.Method, AllowMultiple = true)] 
[Serializable] 
public class TraceAttribute : MethodInterceptionAspect 
{ 
// Details skipped. 
} 

और फिर एक तरीका है कि आपके उपयोग के मामले (जैसे AdventureWorks.BusinessLayer नाम स्थान में सभी सार्वजनिक सदस्य हैं।) को शामिल किया गया में पहलू लागू होते हैं:

[assembly: Trace(AttributeTargetTypes="AdventureWorks.BusinessLayer.*", AttributeTargetMemberAttributes = MulticastAttributes.Public)] 
संबंधित मुद्दे