2012-01-19 12 views
6

का उपयोग कर किसी फ़ंक्शन से वापस लौटें क्या ब्रेकपॉइंट/ट्रेसपॉइंट का उपयोग करके स्वचालित रूप से फ़ंक्शन से वापस जाना संभव है?
मैं निष्पादन बिंदु खींचना नहीं चाहता हूं या ब्रेकपॉइंट हिट होने पर हर बार CTRL + SHIFT + F10 के साथ सेट नहीं करना चाहता हूं।
मैंने हिट करते समय निम्न "संदेश" को "प्रिंटिंग" करने का प्रयास किया, लेकिन निष्पादन बिना परिवर्तन के जारी रहे।ब्रेकपॉइंट

{return;} 
{return null;} 

ध्यान दें कि मुझे वास्तव में कोड बदलने के बिना फ़ंक्शन से वापस लौटने की आवश्यकता है।

स्पष्ट करने के लिए क्या एक Tracepoint है:। "एक tracepoint इसके साथ जुड़े एक कस्टम क्रिया जब एक tracepoint मारा जाता है के साथ एक ब्रेकपाइंट है, डीबगर के बजाय निर्दिष्ट tracepoint कार्रवाई करता है, या के अलावा, प्रोग्राम निष्पादन को तोड़ने । "MSDN से।

यदि आपको नहीं पता कि मेरा "प्रिंटिंग संदेश" के साथ क्या मतलब है, तो आप ट्रेसपॉइंट्स के बारे में this AltDevBlogADay post पढ़ना चाहेंगे। यह अच्छा है।

उत्तर

3

ठीक है, आप के आसपास खुदाई का एक सा के बाद यह कर सकते हैं - लेकिन यह सभी मामलों में काम करने के लिए नहीं जा रहा है।

सावधान रहें, यह मैक्रोज़ का उपयोग करता है और इनलाइन प्रतिनिधियों के साथ काम करने की गारंटी नहीं दी जा सकती है; या उन विधियों के साथ जो वास्तव में कुछ वापस करने की आवश्यकता है। जब ब्रेकपॉइंट मारा जाता है तो यह @juergen d और @Erno द्वारा वर्णित प्रक्रिया को स्वचालित करता है; वर्तमान कार्य का अंत कहां है यह जानने के लिए बहुत ही सरल हेरिस्टिक का उपयोग करना।

आपको पहले अपने मैक्रोज़ वातावरण में इस मैक्रो को जोड़ने की आवश्यकता है (वीएस में एएलटी + एफ 11 के साथ खुला)। सही उस पर क्लिक करें और When hit... मेनू विकल्प मारा - यह कोड शायद के रूप में अच्छा के रूप में मैं सिर्फ यह पता है कि के साथ जगह में ले जाया गया है :)

Sub ExitStack() 
    'get the last-hit breakpoint 
    Dim breakPoint As EnvDTE.Breakpoint 
    breakPoint = DTE.Debugger.BreakpointLastHit() 
    'if the currently open file is the same as where the breakpoint is set 
    '(could search and open it, but the debugger *should* already have done that) 
    If (DTE.ActiveDocument.FullName = breakPoint.File) Then 

     Dim selection As EnvDTE.TextSelection = DTE.ActiveDocument.Selection 
     Dim editPoint As EnvDTE.EditPoint 
     'move the cursor to where the breakpoint is actually defined 
     selection.MoveToLineAndOffset(breakPoint.FileLine, breakPoint.FileColumn) 

     Dim codeElement As EnvDTE.CodeElement 
     codeElement = DTE.ActiveDocument.ProjectItem.FileCodeModel.CodeElementFromPoint(selection.ActivePoint, vsCMElement.vsCMElementFunction) 
     'if a function is found, move the cursor to the last character of it 
     If Not (codeElement Is Nothing) Then 
      Dim lastLine As EnvDTE.TextPoint 

      lastLine = codeElement.GetEndPoint() 
      selection.MoveToPoint(lastLine) 
      selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstText) 
      'execute the SetNextStatement command. 
      'Has to be done via ExecuteCommand 
      DTE.ExecuteCommand("Debug.SetNextStatement") 
     End If 
    End If 
End Sub 

के रूप में यह हो सकता है, अब आप अपने ब्रेकपाइंट सेट कर सकते हैं नहीं है (यह केवल वीएस -2010 में विश्वास करता है मेरा विश्वास है)। स्कॉटगू ने this ब्लॉग पोस्ट में इसका वर्णन किया है।

संवाद से, ExitStack मैक्रो है कि आप बस में चिपकाया है पाते हैं।

भागो डीबगर के साथ कोड जुड़ा हुआ है और जब ब्रेकप्वाइंट मारा जाता है समारोह के कोड के बाकी को छोड़ दिया जाना चाहिए। यह अन्य डीबगर चालों का पालन करना चाहिए - जैसे स्थितियां इत्यादि।

नोट - मैंने this SO का उपयोग किसी समस्या को हल करने के लिए किया था; मूल रूप से मैं सीधे डीबगर की SetNextStatement विधि का आह्वान कर रहा था और यह

मुझे नहीं पता कि कैसे वापस आने वाले तरीकों का व्यवहार किया जाएगा - सिद्धांत रूप में उन्हें उस समय वापस लौटना चाहिए जो स्थानीय मूल्य वापसी स्थानीय है, लेकिन कुछ मामलों में तथ्य यह है कि यह बस काम नहीं करेगा!

समान रूप से यदि ब्रेकपॉइंट एक कोशिश/पकड़ ब्लॉक में है तो यह काम नहीं करेगा - क्योंकि अगली कथन को इसके बाहर कहीं भी सेट करने से पहले प्रयास/पकड़ को बाहर निकालना होगा।

+0

बहुत अच्छा। मैं अभी भी उम्मीद कर रहा हूं कि किसी के पास गैर-मैक्रो, मूल्य-वापसी वाला उत्तर है, लेकिन यह अब तक का सबसे अच्छा है। –

+0

@ प्रोटेक्टोरोन एक नहीं है - जब तक कि आप अपना खुद का डीबगर नहीं लिखते। यदि कोई विधि स्थानीय चर लौटाती है तो आप इसे वापस करने के लिए स्थानीय का उपयोग करने से पहले स्थानीय सेट करने के लिए घड़ी (या यहां तक ​​कि किसी अन्य मैक्रो का उपयोग भी कर सकते हैं) का उपयोग कर सकते हैं। –

7

विजुअल स्टूडियो में आप केवल तीर खींच सकते हैं, जो फ़ंक्शन के अंत तक डीबगिंग करते समय वर्तमान कोड लाइन इंगित करता है।

+4

+1 देखें, या समारोह में एक वापसी कथन, या घुंघराले ब्रेस राइट क्लिक करें और 'सेट अगले स्टेटमेंट' का चयन करें। हालांकि यह इंगित करने लायक है कि यह केवल वर्तमान स्टैक में कोड को इंगित करते समय ही काम करता है; और मुझे लगता है कि कोशिश/पकड़ ब्लॉक प्रभावी नहीं हो सकता है। –

+0

मैं इसे स्वचालित रूप से चाहता हूं। जब भी ब्रेकपॉइंट हिट होता है तो मैं निष्पादन बिंदु को खींचना नहीं चाहता हूं। –

+0

फिर 'goto' कमांड पर विचार करें:' if (your_breakpoint_condition) goto end_marker; ' –

3

दो विकल्प:

  1. आप समारोह इसके निष्पादन को पूरा करने और फोन करने वाले की ओर लौटने के बाद तोड़ने के लिए चाहते हैं। "चरणबद्ध" दबाएं (Shift-F11)
  2. यदि आप कई पंक्तियों के निष्पादन को छोड़ना चाहते हैं, तो पीले मार्कर को अगली पंक्ति में खींचें जिसे आप निष्पादित करना चाहते हैं। याद रखें, मार्कर को किसी स्थान पर खींचने से निष्पादन का क्रम हो सकता है जो हस्तक्षेप किए बिना चलने पर कभी नहीं हो सकता है, इसलिए परिणाम पूरी तरह से गलत हो सकता है।
1

हां, आप इसे सीधे ट्रेसपॉइंट का उपयोग करके कर सकते हैं।

  1. एक बार उस पर टूट रहा है, और फिर या तो रजिस्टर विंडो में रजिस्टर या "@eip" के लिए एक घड़ी जोड़ने EIP को देखकर समारोह के निचले भाग में वापसी कथन का पता लगाएं।
  2. उस लाइन पर एक ट्रेसपॉइंट जोड़ें जिसे आप से कूदना चाहते हैं। याद रखें कि लाइन पर कुछ भी निष्पादित होने से पहले कूद जाएगा। चरण 1 से पते का उपयोग कर ट्रेसपॉइंट की सामग्री {@eip = address} होना चाहिए।
  3. लाभ!

भी https://stackoverflow.com/a/14695736/301729

+0

फ़ंक्शन को मानते हुए _has_ एक रिटर्न स्टेटमेंट ... –

+0

@ प्रोटेक्टोरोन वास्तव में आपको रिटर्न स्टेटमेंट की भी आवश्यकता नहीं है। आप अंतिम समापन घुंघराले ब्रेस को तोड़ने और उस पते का उपयोग करने में सक्षम होना चाहिए। –

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