Creo que hay una sola respuesta a su pregunta, que ha descartado como 'mucho trabajo'. Sin embargo, creo que es porque lo estás haciendo mal. Permítanme presentar los pasos para agregar un punto de interrupción condicional en Thread ID, que son extremadamente fáciles, pero no obvios hasta que los conozca.
Detener el depurador en un punto donde se encuentre en el hilo correspondiente que desee continuar con la depuración de (que yo supongo que es por lo general el primer hilo que llega allí).
Ingrese $TID
en la ventana del reloj.
Añadir un punto de ruptura con la condición $TID == <
valor de $ TID desde la ventana de vigilancia>
,
Ejemplo: $TID == 0x000016a0
continuar la ejecución.
$TID
es una variable mágica para compiladores de Microsoft (por lo menos desde Visual Studio 2003) que tiene el valor del ID del hilo actual. Lo hace mucho más fácil que mirar (FS + 0x18) [0x24]. = D
Dicho esto, puede obtener el mismo comportamiento que los puntos de corte One-Shot del depurador con algunas macros simples. Cuando te pones de pie, el depurador, detrás de las escenas, establece un punto de interrupción, corre hacia ese punto de interrupción y luego lo elimina. La clave para una interfaz de usuario consistente es eliminar esos puntos de interrupción si se golpea CUALQUIER punto de corte.
Los siguientes dos macros proporcionan Paso a paso por y Run To Cursor para el subproceso actual. Esto se lleva a cabo de la misma manera que el depurador, con los puntos de interrupción eliminados después de la ejecución, independientemente de qué punto de interrupción se golpee.
Deseará asignar una combinación de teclas para ejecutarlas.
NOTA: Una advertencia - El Paso a paso por macro sólo funciona correctamente si el cursor está en la línea que desea pasar por encima. Esto se debe a que determina la ubicación actual por la ubicación del cursor y simplemente agrega una al número de línea. Es posible que pueda reemplazar el cálculo de ubicación con información sobre el punto de ejecución actual, aunque no pude localizar esa información desde el IDE de macro.
¡Aquí están y buena suerte, cacería de errores!
Para utilizar estas macros en Visual Studio:
1. Abra el IDE de Macro (desde el menú, seleccionar: Herramientas-> Macros-> IDE Macro ...)
2. Agregar un nuevo archivo de código (desde el menú: seleccionar: Proyecto-> Agregar nuevo elemento ..., elegir código del archivo y haga clic en Agregar )
3. Pegar en este código.
4. Guarde el archivo.
Para añadir combinaciones de teclas para ejecutar estas macros en Visual Studio:
1. Opciones de apertura (desde el menú, seleccionar: Herramientas-> Opciones)
2. Expandir a Ambiental-> Teclado
3. En Mostrar comandos que contienen:, tipo Macros. para ver todas sus macros.
4. Seleccione una macro, haga clic en en la combinación de teclas Press:
5. Tipo de la combinación que desea utilizar (de corrección borra combos mecanografiadas)
6. Haga clic en Asignar para fijar el acceso directo para ejecutar la macro seleccionada.
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Public Module DebugHelperFunctions
Sub RunToCursorInMyThread()
Dim textSelection As EnvDTE.TextSelection
Dim myThread As EnvDTE.Thread
Dim bp As EnvDTE.Breakpoint
Dim bps As EnvDTE.Breakpoints
' For Breakpoints.Add()
Dim FileName As String
Dim LineNumber As Integer
Dim ThreadID As String
' Get local references for ease of use
myThread = DTE.Debugger.CurrentThread
textSelection = DTE.ActiveDocument.Selection
LineNumber = textSelection.ActivePoint.Line
FileName = textSelection.DTE.ActiveDocument.FullName
ThreadID = myThread.ID
' Add a "One-Shot" Breakpoint in current file on current line for current thread
bps = DTE.Debugger.Breakpoints.Add("", FileName, LineNumber, 1, "$TID == " & ThreadID)
' Run to the next stop
DTE.Debugger.Go(True)
' Remove our "One-Shot" Breakpoint
For Each bp In bps
bp.Delete()
Next
End Sub
Sub StepOverInMyThread()
Dim textSelection As EnvDTE.TextSelection
Dim myThread As EnvDTE.Thread
Dim bp As EnvDTE.Breakpoint
Dim bps As EnvDTE.Breakpoints
' For Breakpoints.Add()
Dim FileName As String
Dim LineNumber As Integer
Dim ThreadID As String
' Get local references for ease of use
myThread = DTE.Debugger.CurrentThread
textSelection = DTE.ActiveDocument.Selection
LineNumber = textSelection.ActivePoint.Line
FileName = textSelection.DTE.ActiveDocument.FullName
ThreadID = myThread.ID
LineNumber = LineNumber + 1
' Add a "One-Shot" Breakpoint in current file on current line for current thread
bps = DTE.Debugger.Breakpoints.Add("", FileName, LineNumber, 1, "$TID == " & ThreadID)
' Run to the next stop
DTE.Debugger.Go(True)
' Remove our "One-Shot" Breakpoint
For Each bp In bps
bp.Delete()
Next
End Sub
End Module
Negación: Escribí estas macros en Visual Studio 2005 . Probablemente pueda usarlos bien en Visual Studio 2008. Pueden requerir modificaciones para Visual Studio 2003 y versiones anteriores.
¿Funciona esto para cualquiera? No pude hacer que funcione. –
Funciona para mí. = D ¿Cuál fue tu error? – Aaron
@ Aaron: Estoy usando VS 2008 cuando ingreso $ TID en la ventana de Inspección recibo el error "El nombre no existe en el contexto actual" – akif