Сценарий для вставки вхождения в каждую функцию в проект?

Используйте крон с находкой для удаления файлов, более старых, чем данный порог. Например, для удаления файлов, к которым не получали доступ, по крайней мере, в течение недели.

find .session/ -atime +7  -exec rm {} \;
5
задан i_am_jorf 18 September 2009 в 03:18
поделиться

5 ответов

Было что-то подобное для добавления кода профилирования с использованием макросов в VS, вот код (это также группирует все под одной командой «отменить» и перечисляет все изменения в собственном окне вывода)

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics

Public Module Module1

    Function GetOutputWindowPane(ByVal Name As String, Optional ByVal show As Boolean = True) As OutputWindowPane
        Dim window As Window
        Dim outputWindow As OutputWindow
        Dim outputWindowPane As OutputWindowPane

        window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
        If show Then window.Visible = True
        outputWindow = window.Object
        Try
            outputWindowPane = outputWindow.OutputWindowPanes.Item(Name)
        Catch e As System.Exception
            outputWindowPane = outputWindow.OutputWindowPanes.Add(Name)
        End Try
        outputWindowPane.Activate()
        Return outputWindowPane
    End Function

    Const ToInsert As String = "/* Inserted text :D */"

    Sub AddProfilingToFunction(ByVal func As CodeFunction2)
        Dim editPoint As EditPoint2 = func.StartPoint.CreateEditPoint()
        While editPoint.GetText(1) <> "{"
            editPoint.CharRight()
        End While

        editPoint.CharRight()
        editPoint.InsertNewLine(1)

        Dim insertStartLine As Integer = editPoint.Line
        Dim insertStartChar As Integer = editPoint.LineCharOffset
        editPoint.Insert(ToInsert)

        GetOutputWindowPane("Macro Inserted Code").OutputString( _
            editPoint.Parent.Parent.FullName & _
            "(" & insertStartLine & "," & insertStartChar & _
            ") : Inserted Code """ & ToInsert & """" & vbCrLf)
    End Sub

    Sub AddProfilingToProject(ByVal proj As Project)
        If Not proj.CodeModel() Is Nothing Then
            Dim EventTitle As String = "Add Profiling to project '" & proj.Name & "'"
            GetOutputWindowPane("Macro Inserted Code").OutputString("Add Profiling to project '" & proj.Name & "'" & vbCrLf)
            DTE.UndoContext.Open(EventTitle)
            Try
                Dim allNames As String = ""
                For i As Integer = 1 To proj.CodeModel().CodeElements.Count()
                    If proj.CodeModel().CodeElements.Item(i).Kind = vsCMElement.vsCMElementFunction Then
                        AddProfilingToFunction(proj.CodeModel().CodeElements.Item(i))
                    End If
                Next
            Finally
                DTE.UndoContext.Close()
            End Try
            GetOutputWindowPane("Macro Inserted Code").OutputString(vbCrLf)
        End If
    End Sub

    Sub AddProfilingToSolution()
        GetOutputWindowPane("Macro Inserted Code").Clear()
        If Not DTE.Solution Is Nothing And DTE.Solution.IsOpen() Then
            For i As Integer = 1 To DTE.Solution.Projects.Count()
                AddProfilingToProject(DTE.Solution.Projects.Item(i))
            Next
        End If
    End Sub

End Module

PS Не забудьте изменить «Const ToInsert As String = ...» на код, который вы действительно хотите вставить

4
ответ дан 13 December 2019 в 05:38
поделиться

Я сделал это несколько лет назад в VS.
Regex поможет вам.
Кстати, вставлять другую строку не обязательно. Вы можете добавить ту же строку, например:


LOG(debug) << __FUNCTION__ << " called.";

EDIT

что-то вроде этого регулярного выражения (действительно только для VS):


(void|char|int):b+:i\:\::i\([^(]*\):b*\{

Вы должны расширить регулярное выражение в зависимости от ваших потребностей.

2
ответ дан 13 December 2019 в 05:38
поделиться

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

1
ответ дан 13 December 2019 в 05:38
поделиться

Рассматривали ли вы запуск кода в отладчике и простое пошаговое выполнение всего приложения (или иным образом устанавливали точку останова на интересующем вас коде и просто проходили через него)? Я считаю, что это иногда бывает полезным при работе с большой устаревшей базой кода, которую я не писал.

В качестве альтернативы, если вы компилируете в мире VS, подумайте о том, чтобы взглянуть на / Gh и / GH переключается на cl.exe . Кажется, они позволяют вам перехватить вход / выход из функции и вызвать другую процедуру. Я никогда раньше ими не пользовался, но, похоже, они напрямую отвечают вашим потребностям.

1
ответ дан 13 December 2019 в 05:38
поделиться

Поскольку вы используете Visual C ++, и кажется, что вам нужно только имя вызываемой функции, это можно было бы автоматизировать дополнительно, используя следующие переключатели командной строки на cl.exe :

  • / Gh : Включить вызов функции _penter
  • / GH : Включить вызов функции _pexit

В основном, предоставление этих переключателей означает, что компилятор будет автоматически вводить вызовы функций с именами _penter () и _pexit () всякий раз, когда любая функция начинается или заканчивается. Затем вы можете предоставить отдельно скомпилированный модуль, реализующий эти две функции, который либо (а) вызывает некоторую вспомогательную библиотеку, такую ​​как DbgHelp , чтобы определить имя вызываемой функции, или (б) просто берет адрес возврата из стека и дословно распечатывает его - после этого напишите сценарий для преобразования этих адресов в имена функций, просмотрев, например, файл карты компоновщика, созданный, если вы передадите / link / MAP: mymapfile.txt в cl.exe .

Конечно, вам нужно будет поместить свои _penter () и _pexit () в отдельный модуль с отключенными / Gh и / GH , чтобы избежать бесконечной рекурсии! :)

Вам необходимо поместить ваши _penter () и _pexit () в отдельный модуль с отключенными / Gh и / GH , чтобы избежать бесконечная рекурсия! :)

Вам необходимо поместить ваши _penter () и _pexit () в отдельный модуль с отключенными / Gh и / GH , чтобы избежать бесконечная рекурсия! :)

4
ответ дан 13 December 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: