Как поставить точку останова в каждой функции файла .cpp? - PullRequest
14 голосов
/ 02 октября 2008

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

Ответы [ 8 ]

18 голосов
/ 30 июля 2010

(Это не совсем то, что вы просите, но почти:)

Вы можете установить точку останова на для каждой функции-члена класса в Visual Studio, открыв диалоговое окно Новая точка останова и введя:

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.

5 голосов
/ 11 декабря 2008

Вот быстрая реализация идеи 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
2 голосов
/ 13 мая 2009

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

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

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

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

2 голосов
/ 02 октября 2008

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

  1. Перейти к началу файла
  2. Ctrl - Shift - R (начать запись)
  3. ctrl - I (инкрементальный поиск)
  4. {(поиск первого {символа).
  5. F9 (установить точку останова)
  6. ctrl -] (перейти к соответствующему символу)
  7. ctrl - shift - R (остановить запись)

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

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

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

Подобные вещи можно бесконечно изменять в соответствии с вашей кодовой базой

1 голос
/ 09 октября 2008

Вот как можно добиться чего-то подобного в WinDbg:

bm mymodule!CSpam::*

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

Я все еще ищу что-нибудь похожее на эту функциональность в Visual Studio.

0 голосов
/ 15 мая 2016

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

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);
}
0 голосов
/ 26 ноября 2013

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

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
0 голосов
/ 02 октября 2008

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

#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

вверху файла.

...