Используйте крон с находкой для удаления файлов, более старых, чем данный порог. Например, для удаления файлов, к которым не получали доступ, по крайней мере, в течение недели.
find .session/ -atime +7 -exec rm {} \;
Было что-то подобное для добавления кода профилирования с использованием макросов в 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 = ...» на код, который вы действительно хотите вставить
Я сделал это несколько лет назад в VS.
Regex поможет вам.
Кстати, вставлять другую строку не обязательно. Вы можете добавить ту же строку, например:
LOG(debug) << __FUNCTION__ << " called.";
EDIT
что-то вроде этого регулярного выражения (действительно только для VS):
(void|char|int):b+:i\:\::i\([^(]*\):b*\{
Вы должны расширить регулярное выражение в зависимости от ваших потребностей.
Профилировщик времени выполнения как бы предоставит вам эту информацию: он скажет, какие подпрограммы были вызваны из каждой подпрограммы и сколько раз (но не в какой последовательности).
Рассматривали ли вы запуск кода в отладчике и простое пошаговое выполнение всего приложения (или иным образом устанавливали точку останова на интересующем вас коде и просто проходили через него)? Я считаю, что это иногда бывает полезным при работе с большой устаревшей базой кода, которую я не писал.
В качестве альтернативы, если вы компилируете в мире VS, подумайте о том, чтобы взглянуть на / Gh
и
/ GH
переключается на cl.exe
. Кажется, они позволяют вам перехватить вход / выход из функции и вызвать другую процедуру. Я никогда раньше ими не пользовался, но, похоже, они напрямую отвечают вашим потребностям.
Поскольку вы используете 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
, чтобы избежать бесконечная рекурсия! :)