2008-10-01 13 views
14

क्या कोई मैक्रो है जो करता है? कौन सी डीटीई वस्तुओं का उपयोग करने के लिए?.cpp फ़ाइल के प्रत्येक फ़ंक्शन में ब्रेकपॉइंट कैसे डालें?

+0

मजबूत तर्क मैं आज देखा है खिड़कियों के तहत विकासशील बंद करो और gdb जैसे उपकरणों के साथ लिनक्स का उपयोग करने कि होगा आपको एक फाइल पर ब्रेकपॉइंट करने दें। – Owl

उत्तर

2

मैं क्या DTE कार्यों का उपयोग करने के लिए पता नहीं है, लेकिन आप बहुत बस एक मैक्रो काफी यह कर सकता है रिकॉर्ड कर सकता है: फ़ाइल

  • ctrl के शीर्ष करने के

    1. जाओ - पाली - आर (रिकॉर्डिंग शुरू करें)
    2. ctrl - I (वृद्धिशील खोज)
    3. {(पहले {चरित्र) की खोज करें।
    4. F9 (सेट ब्रेकप्वाइंट)
    5. ctrl -] (मिलान करने के लिए जाना} चरित्र)
    6. ctrl - पाली - आर (स्टॉप रिकॉर्डिंग)

    अब बस इस के साथ चलने और अधिक (Ctrl - पारी पी बार-बार) जब तक आप फ़ाइल के अंत तक नहीं पहुंच जाते।

    आप नामस्थान है, तो बदल 4. करने के लिए:

    1. ((समारोह परिभाषा की शुरुआत)
    2. esc पर "(" के लिए खोज (वृद्धिशील रोक खोज)
    3. ctrl - मैं (फिर से वृद्धिशील खोज)
    4. {(समारोह शरीर की शुरुआत)

    बात इस तरह की असीम अपने codebase सूट करने के लिए संशोधित किया जा सकता

  • +0

    मेरे पास अनाम नामस्थान हैं, क्या यह काम करेगा? (चेक करने के लिए इस समय वीएस नहीं है) – Constantin

    +0

    दरअसल (मेरी पिछली टिप्पणी को अनदेखा करें) यह स्पष्ट रूप से नामस्थान के अंदर कोड को छोड़ देगा। –

    +0

    में संपादित किए गए परिवर्तन को आज़माएं इसे वीएस 2010 में काम करने के लिए नहीं मिल सकता - एक मैक्रो रिकॉर्ड करते समय वृद्धिशील खोज अक्षम है। –

    0

    फ़ाइल के शीर्ष पर इस रखो:

    #define WANT_BREAK_IN_EVERY_FUNCTION 
    
    #ifdef WANT_BREAK_IN_EVERY_FUNCTION 
    #define DEBUG_BREAK DebugBreak(); 
    #else 
    #define DEBUG_BREAK 
    #endif 
    

    तो हर कार्य की शुरुआत में DEBUG_BREAK डालें, इस तरह:

    void function1() 
    { 
        DEBUG_BREAK 
        // the rest of the function 
    } 
    
    void function2() 
    { 
        DEBUG_BREAK 
        // the rest of the function 
    } 
    

    अब आप नहीं चाहते जब डिबग टूटता है, टिप्पणी लाइन

    // #define WANT_BREAK_IN_EVERY_FUNCTION 
    

    फ़ाइल के शीर्ष पर।

    +1

    मुझे एक अनियंत्रित स्वचालित समाधान चाहिए। मैं बस प्रत्येक समारोह में F9 दबा सकता हूं। – Constantin

    1

    यहाँ कैसे कुछ इसी तरह WinDbg में प्राप्त किया जा सकता है:

    bm mymodule!CSpam::* 
    

    इस वर्ग (या नाम स्थान) CSpam की हर विधि में ब्रेकप्वाइंट डालता मॉड्यूल mymodule में।

    मैं अभी भी विजुअल स्टूडियो में इस कार्यक्षमता के करीब कुछ भी ढूंढ रहा हूं।

    5

    यहाँ 1800 जानकारी के विचार की एक त्वरित कार्यान्वयन है:

    Sub TemporaryMacro() 
        DTE.ActiveDocument.Selection.StartOfDocument() 
        Dim returnValue As vsIncrementalSearchResult 
        While True 
         DTE.ActiveDocument.ActiveWindow.Object.ActivePane.IncrementalSearch.StartForward() 
         returnValue = DTE.ActiveDocument.ActiveWindow.Object.ActivePane.IncrementalSearch.AppendCharAndSearch(AscW("{")) 
         DTE.ActiveDocument.ActiveWindow.Object.ActivePane.IncrementalSearch.Exit() 
         If Not (returnValue = vsIncrementalSearchResult.vsIncrementalSearchResultFound) Then 
          Return 
         End If 
         DTE.ExecuteCommand("Debug.ToggleBreakpoint") 
         DTE.ExecuteCommand("Edit.GotoBrace") 
         DTE.ActiveDocument.Selection.CharRight() 
        End While 
    End Sub 
    
    +0

    +1, लेकिन स्वीकार नहीं कर सकता, क्योंकि यह नामस्थानों के साथ काम नहीं करता है। – Constantin

    +2

    यदि आपको नामस्थानों के साथ समस्याएं आ रही हैं, तो दस्तावेज़ की शुरुआत में जाने वाली पहली पंक्ति पर टिप्पणी करें। आपको उस ब्लॉक की शुरुआत में कर्सर को मैन्युअल रूप से रखना होगा, जिसे आप टॉगल करना चाहते हैं, लेकिन यह काम करेगा। – tfinniga

    2

    तरह Constantin की विधि ... इस क्षेत्र WinDbg की तरह लगता है।

    चूंकि आपके पास सीपीपी है, (भले ही आपने कुछ प्राप्त करने के लिए कुछ स्क्रिप्ट नहीं किया हो), विंडोज़ के लिए डिबगिंग टूल के logger भाग का उपयोग करने में कोई समस्या नहीं होनी चाहिए ... यह एक बहुत ही आसान टूल है, शर्म की बात है कि बहुत कम लोग इसका इस्तेमाल करते हैं।

    समृद्ध प्रतीकात्मक जानकारी, हुक/प्रोफाइलिंग/लचीला उपकरण के साथ आसानी से लॉगर डीबग का सी/कॉम/सी ++;

    One way to activate Logger is to start CDB or WinDbg and attach to a user-mode target application as usual. Then, use the !logexts.logi or !logexts.loge extension command. This will insert code at the current breakpoint that will jump off to a routine that loads and initializes Logexts.dll in the target application process. This is referred to as "injecting Logger into the target application."

    +0

    अच्छी चीजें! ---- – Constantin

    +0

    मैं इसके बारे में और जानना चाहता हूं, मुझे लोड होने में समस्या हो रही है और मैं संदर्भ देखना चाहता हूं कि कुछ Google protobuf अपवादों के लिए यह अनुमानित डुप्लिकेशंस हो रहा है। – jxramos

    17

    (यह आपके लिए काफी जो चाह रहे हैं, लेकिन लगभग :)

    आप एक ब्रेकपाइंट पर हर सदस्य समारोह एक वर्ग के दृश्य स्टूडियो में लाकर रख सकते हैं नहीं है न्यू ब्रेकप्वाइंट संवाद और प्रवेश:

    CMyClass::* 
    

    अधिक जानकारी के लिए http://blogs.msdn.com/b/habibh/archive/2009/09/10/class-breakpoint-how-to-set-a-breakpoint-on-a-c-class-in-the-visual-studio-debugger.aspx देखें।

    +1

    जानना अच्छा है ... – Constantin

    0

    एक मैक्रो है, लेकिन मैंने इसे केवल सी # के साथ परीक्षण किया।

    Sub BreakAtEveryFunction() 
    For Each project In DTE.Solution.Projects 
        SetBreakpointOnEveryFunction(project) 
    Next project 
    End Sub 
    
    
    Sub SetBreakpointOnEveryFunction(ByVal project As Project) 
    Dim cm = project.CodeModel 
    
    ' Look for all the namespaces and classes in the 
    ' project. 
    Dim list As List(Of CodeFunction) 
    list = New List(Of CodeFunction) 
    Dim ce As CodeElement 
    For Each ce In cm.CodeElements 
        If (TypeOf ce Is CodeNamespace) Or (TypeOf ce Is CodeClass) Then 
         ' Determine whether that namespace or class 
         ' contains other classes. 
         GetClass(ce, list) 
        End If 
    Next 
    
    For Each cf As CodeFunction In list 
    
        DTE.Debugger.Breakpoints.Add(cf.FullName) 
    Next 
    
    End Sub 
    
    Sub GetClass(ByVal ct As CodeElement, ByRef list As List(Of CodeFunction)) 
    
    ' Determine whether there are nested namespaces or classes that 
    ' might contain other classes. 
    Dim aspace As CodeNamespace 
    Dim ce As CodeElement 
    Dim cn As CodeNamespace 
    Dim cc As CodeClass 
    Dim elements As CodeElements 
    If (TypeOf ct Is CodeNamespace) Then 
        cn = CType(ct, CodeNamespace) 
        elements = cn.Members 
    Else 
        cc = CType(ct, CodeClass) 
        elements = cc.Members 
    End If 
    Try 
        For Each ce In elements 
         If (TypeOf ce Is CodeNamespace) Or (TypeOf ce Is CodeClass) Then 
          GetClass(ce, list) 
         End If 
         If (TypeOf ce Is CodeFunction) Then 
          list.Add(ce) 
         End If 
        Next 
    Catch 
    End Try 
    End Sub 
    
    +1

    हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। –

    +0

    @ साहिल मित्तल धन्यवाद, सही। – alexkovelsky

    +0

    दिलचस्प है, हालांकि आमतौर पर मैं सी # कोड को .cpp फ़ाइलों में नहीं डालता हूं। मुझे आश्चर्य है कि यह सी ++ के लिए भी काम करता है। – Constantin

    0

    यहाँ एक तरह से यह करने के लिए है (मैं आपको चेतावनी देता यह hacky है):

    EnvDTE.TextSelection textSelection = (EnvDTE.TextSelection)dte.ActiveWindow.Selection; 
    // I'm sure there's a better way to get the line count than this... 
    var lines = File.ReadAllLines(dte.ActiveDocument.FullName).Length; 
    var methods = new List<CodeElement>(); 
    var oldLine = textSelection.AnchorPoint.Line; 
    var oldLineOffset = textSelection.AnchorPoint.LineCharOffset; 
    EnvDTE.CodeElement codeElement = null; 
    for (var i = 0; i < lines; i++) 
    { 
        try 
        { 
         textSelection.MoveToLineAndOffset(i, 1); 
         // I'm sure there's a better way to get a code element by point than this... 
         codeElement = textSelection.ActivePoint.CodeElement[vsCMElement.vsCMElementFunction]; 
         if (codeElement != null) 
         { 
          if (!methods.Contains(codeElement)) 
          { 
           methods.Add(codeElement); 
          } 
         } 
        } 
        catch 
        { 
         //MessageBox.Show("Add error handling here."); 
        } 
    } 
    
    // Restore cursor position 
    textSelection.MoveToLineAndOffset(oldLine, oldLineOffset); 
    
    // This could be in the for-loop above, but it's here instead just for 
    // clarity of the two separate jobs; find all methods, then add the 
    // breakpoints 
    foreach (var method in methods) 
    { 
        dte.Debugger.Breakpoints.Add(
         Line: method.StartPoint.Line, 
         File: dte.ActiveDocument.FullName); 
    } 
    
    संबंधित मुद्दे