debugging - ver - que es un punto de interrupcion en programacion
¿Cómo poner un punto de interrupción en cada función del archivo.cpp? (8)
¿Hay una macro que lo hace? ¿Qué objetos DTE usar?
No sé qué funciones DTE usar, pero podría simplemente grabar una macro que prácticamente podría hacerlo:
- Ve a la cima del archivo
- ctrl - shift - R (iniciar grabación)
- ctrl - I (búsqueda incremental)
- {(busca el primer {personaje).
- F9 (establecer punto de interrupción)
- ctrl -] (ir a coincidencia} carácter)
- ctrl - shift - R (detener la grabación)
Ahora ejecute esto una y otra vez (ctrl - shift P repetidamente) hasta que llegue al final del archivo.
Si tiene espacios de nombres, cambie 4. a:
- ((busque "(" al comienzo de la definición de la función)
- esc (detener la búsqueda incremental)
- ctrl - I (búsqueda incremental de nuevo)
- {(inicio del cuerpo de la función)
Este tipo de cosas se pueden modificar infinitamente para adaptarse a su base de código
Pon esto en la parte superior del archivo:
#define WANT_BREAK_IN_EVERY_FUNCTION
#ifdef WANT_BREAK_IN_EVERY_FUNCTION
#define DEBUG_BREAK DebugBreak();
#else
#define DEBUG_BREAK
#endif
luego inserte DEBUG_BREAK al comienzo de cada función, como esta:
void function1()
{
DEBUG_BREAK
// the rest of the function
}
void function2()
{
DEBUG_BREAK
// the rest of the function
}
Cuando ya no quiera las interrupciones de depuración, comente la línea
// #define WANT_BREAK_IN_EVERY_FUNCTION
en la parte superior del archivo.
Así es como se podría lograr algo similar en WinDbg:
bm mymodule!CSpam::*
Esto pone el punto de corte en cada método de clase (o espacio de nombres) CSpam
en módulo mymodule
.
Todavía estoy buscando algo cercano a esta funcionalidad en Visual Studio.
Aquí hay una implementación rápida de la idea de 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
Como el método de Constantin ... Esto parece territorio windbg.
Como tienes el cpp, (incluso si no lo hicieras, podrías crear un script para resolverlo), no debería ser un problema usar logger como parte de las herramientas de depuración para Windows ... es una herramienta muy útil, es una pena que haya poca gente usarlo
logger C / COM / C ++ de depuración fácil, con gran cantidad de información simbólica, ganchos / perfilado / instrumentación flexible;
Una forma de activar Logger es iniciar CDB o WinDbg y adjuntarlo a una aplicación de destino de modo de usuario como de costumbre. Luego, use el comando de extensión! Logexts.logi o! Logexts.loge. Esto insertará el código en el punto de interrupción actual que saltará a una rutina que carga e inicializa Logexts.dll en el proceso de aplicación de destino. Esto se conoce como "Inyectar Logger en la aplicación de destino".
(Esto no es exactamente lo que estás pidiendo, pero casi :)
Puede poner un punto de interrupción en cada función miembro de una clase en Visual Studio al abrir el cuadro de diálogo Nuevo punto de interrupción e ingresar:
CMyClass::*
Ver 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 para más detalles.
Hay una macro, pero la probé solo con 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
Aquí hay una manera de hacerlo (te advierto que es hacky):
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);
}