Я думаю, что есть только один ответ на ваш вопрос, который вы отклонили как «слишком много работы». Тем не менее, я считаю, что это потому, что вы делаете это неправильно. Позвольте мне представить шаги для добавления условной точки останова к идентификатору потока, которые чрезвычайно просты, но не очевидны, пока вы их не знаете.
Остановите отладчик в точке, в которой вы находитесь в правильном потоке, в котором вы хотите продолжить отладку (, который, как я предполагаю, обычно является первым потоком, который получает ).
Введите $TID
в окне просмотра.
Добавить точку останова с условием $TID == <
значение $ TID из окна просмотра >
,
Пример : $TID == 0x000016a0
Продолжить выполнение.
$TID
- магическая переменная для компиляторов Microsoft (начиная с версии по крайней мере Visual Studio 2003), которая имеет значение текущего идентификатора потока. Это намного проще, чем смотреть (FS + 0x18) [0x24]. = D
При этом вы можете получить то же поведение, что и точки останова One-Shot отладчика с некоторыми простыми макросами. Когда вы перешагиваете, закулисный отладчик устанавливает точку останова, запускается до этой точки останова и затем удаляет ее. Ключом к согласованному пользовательскому интерфейсу является удаление этих точек останова, если достигнута точка останова ANY .
Следующие два макроса предоставляют Step Over и Run To Cursor для текущего потока. Это выполняется так же, как и отладчик, с точками останова, удаляемыми после выполнения, независимо от того, какая точка останова достигнута.
Вы хотите назначить комбинацию клавиш для их запуска.
ПРИМЕЧАНИЕ : одно предупреждение - макрос Step Over работает правильно только в том случае, если курсор находится на линии, которую вы хотите перешагнуть. Это связано с тем, что он определяет текущее местоположение по местоположению курсора и просто добавляет его к номеру строки. Возможно, вы сможете заменить вычисление местоположения информацией о текущей точке выполнения, хотя мне не удалось найти эту информацию из Macro IDE.
Вот они и удачи на охоте на жуков !!
Чтобы использовать эти макросы в Visual Studio:
1. Откройте Macro IDE (в меню выберите: Инструменты-> Макросы-> Macro IDE ... )
2. Добавьте новый файл кода (в меню: выберите: Проект-> Добавить новый элемент ... , выберите Файл кода и нажмите Добавить )
3. Вставьте этот код.
4. Сохраните файл.
Чтобы добавить комбинации клавиш для запуска этих макросов в Visual Studio:
1. Откройте Параметры (в меню выберите: Инструменты-> Параметры )
2. Разверните до Среда-> Клавиатура
3. В Показать команды, содержащие: , введите Макросы. , чтобы увидеть все ваши макросы.
4. Выберите макрос, затем нажмите Нажмите клавиши быстрого доступа:
5. Введите комбо, которое вы хотите использовать ( Backspace удаляет набранные комбо )
6. нажмите Назначить , чтобы настроить ярлык для запуска выбранного макроса.
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
Отказ от ответственности : я написал эти макросы в Visual Studio 2005 . Вы, вероятно, можете использовать их в Visual Studio 2008 . Они могут потребовать модификации для Visual Studio 2003 и ранее.