Как поставить точку останова в каждой функции .cpp файла? - программирование
Подтвердить что ты не робот

Как поставить точку останова в каждой функции .cpp файла?

Есть ли макрос, который делает это? Какие объекты DTE использовать?

4b9b3361

Ответ 2

Вот краткая реализация идеи 1800 INFORMATION:

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

Ответ 3

Я не знаю, какие функции DTE использовать, но вы могли бы просто записать макрос, который мог бы в значительной степени сделать это:

  • Перейти в начало файла
  • ctrl - shift - R (начало записи)
  • ctrl - я (инкрементный поиск)
  • {(поиск первого {символа).
  • F9 (заданная точка останова)
  • ctrl -] (перейти к соответствующему символу)
  • ctrl - shift - R (остановка записи)

Теперь просто запустите это снова и снова (ctrl - shift P) до тех пор, пока вы не дойдете до конца файла.

Если у вас есть пространства имен, измените 4. на:

  1. ((поиск "(" в начале определения функции)
  2. esc (остановить инкрементный поиск)
  3. ctrl - я (инкрементный поиск снова)
  4. {(начало тела функции)

Эта вещь может быть бесконечно модифицирована в соответствии с вашей кодовой базой

Ответ 4

Как метод Константина... Это похоже на территорию windbg.

Так как у вас есть cpp (даже если вы не смогли script что-то получить), не должно быть проблем с использованием logger часть инструментов отладки для окон... это очень удобный инструмент, так стыдно, что мало кто его использует.

logger debug C/COM/С++ легко, с богатой символической информацией, крючками/профилированием/гибкими инструментами;

Один из способов активации Logger - запустить CDB или WinDbg и подключиться к целевому приложению пользовательского режима, как обычно. Затем используйте команду! Logexts.logi или! Logexts.loge. Это добавит код в текущую точку останова, которая перейдет к подпрограмме, которая загружает и инициализирует Logexts.dll в целевом процессе приложения. Это называется "впрыском Logger в целевое приложение" .

Ответ 5

Вот как нечто подобное можно было бы сделать в WinDbg:

bm mymodule!CSpam::*

Это ставит точку останова в каждом методе класса (или пространства имен) CSpam в модуле mymodule.

Я все еще ищу что-то близкое к этой функциональности в Visual Studio.

Ответ 6

Поместите это в начало файла:

#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

в верхней части файла.

Ответ 7

Есть макрос, но я тестировал его только с помощью С#.

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

Ответ 8

Вот один из способов сделать это (я предупреждаю вас, это хаки):

EnvDTE.TextSelection textSelection = (EnvDTE.TextSelection)dte.ActiveWindow.Selection;
// I'm sure there 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 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 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);
}