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

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

Самый сильный аргумент, который я видел сегодня, чтобы прекратить разработку под Windows и использовать Linux с такими инструментами, как gdb, которые позволят вам установить точку останова на файле.

Owl 16.06.2017 16:36
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
14
1
7 810
8

Ответы 8

Я не знаю, какие функции 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. {(начало тела функции)

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

У меня анонимные пространства имен, это сработает? (На данный момент нет VS для проверки)

Constantin 02.10.2008 02:30

На самом деле (игнорируйте мой предыдущий комментарий) он явно пропустил бы код внутри пространства имен. Попробуйте изменение, которое я редактировал в

1800 INFORMATION 02.10.2008 04:40

Не могу заставить это работать в VS 2010 - инкрементный поиск отключен во время записи макроса.

Matthew Read 26.07.2011 23:14

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

#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

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

Мне нужно ненавязчивое автоматизированное решение. Я мог бы просто нажать F9 в каждой функции.

Constantin 02.10.2008 11:56

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

bm mymodule!CSpam::*

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

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

Вот быстрая реализация идеи 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

+1, но не могу принять, потому что он не работает с пространствами имен.

Constantin 15.12.2008 11:28

Если у вас проблемы с пространствами имен, просто закомментируйте первую строку, идущую в начало документа. Вам нужно будет вручную поместить курсор в начало блока, который вы хотите переключить, но это сработает.

tfinniga 02.08.2010 20:00

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

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

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

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

Я хотел узнать больше об этом, у меня проблема во время загрузки, и я хочу увидеть контекст, в котором это предполагаемое дублирование происходит для некоторых исключений google protobuf.

jxramos 11.08.2016 00:16

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

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

CMyClass::*

Подробнее см. http://blogs.msdn.com/b/habibh/archive/2009/09/10/class-breakpoint-how-to-set-a-breakpoint-on-ac-class-in-the-visual-studio- debugger.aspx.

Макрос есть, но я тестировал его только на 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

Интересно, хотя обычно я не помещаю код C# в файлы .cpp. Интересно, работает ли это также для C++.

Constantin 02.12.2013 03:51

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

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);
}

Другие вопросы по теме